2011-04-21 87 views
3

我有4个表格:用户,消息,文件,笔记。我想做一个查询,删除所有用户的内容。将以下工作:这是一个有效的MySQL查询?

DELETE FROM users, messages, files, notes WHERE userId = '$userId' 

所有4台已经拿到了列userId

+0

你说“以下工作?”你为什么不先试试自己? – 2011-04-21 14:52:13

+0

@Naveed我在这个网站上的任何地方都没有看到任何规则,当我提出问题时,您会被征税。 – 2011-04-21 14:54:54

回答

5

可以在拆分的声明四个单独的语句,以删除与该用户ID相关联的行。

DELETE FROM users WHERE userId = '$userId' 
DELETE FROM messages WHERE userId = '$userId' 
DELETE FROM files WHERE userId = '$userId' 
DELETE FROM notes WHERE userId = '$userId' 

另一种替代方法是在外键之间级联删除。

创建外键时,您可以选择想要对子记录进行删除父记录的操作。这通过在创建外键时指定ON Delete来表示。下面是在WHERE语句有一定的参考http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

[CONSTRAINT [symbol]] FOREIGN KEY 
    [index_name] (index_col_name, ...) 
    REFERENCES tbl_name (index_col_name,...) 
    [ON DELETE reference_option] 
    [ON UPDATE reference_option] 
1

,如果你有一个以上的表引用,你应该参考TABLE.COLUMN, 如:WHERE users.userid = '$userId'. 我建议做每桌1句

-1
+0

否。链接到的文档表明,从多个表中删除时必须使用USING子句。 – 2011-04-21 14:53:53

+0

ERR .. no..Multiple表语法: 删除[LOW_PRIORITY] [QUICK] [忽略] tbl_name [*] [,tbl_name [*]] ... FROM table_references [WHERE where_condition] – ethrbunny 2011-04-22 14:32:22

+0

@ethrbunny你说得很对;我需要检查我的视力。 – 2011-04-23 11:09:25

2
DELETE u, m, f, p 
FROM users u 
LEFT JOIN 
     messages m 
ON  m.user_id = u.id 
LEFT JOIN 
     files f 
ON  f.user_id = u.id 
LEFT JOIN 
     posts p 
ON  p.user_id = u.id 
WHERE u.id = 1 

这假定与id = 1记录在users存在,否则什么也不会被删除。

但是,请注意,这不是非常有效,并且四个单独的删除将更好地工作。

+0

为什么不内连接? – Johan 2011-04-21 15:01:56

+0

@Johan:因为至少在一个表中没有'user_id = 1'的记录,所以内部连接不会删除任何东西。 – Quassnoi 2011-04-21 15:03:29

1

在你的WHERE中,你有userId ='$ userId'。其他人可以纠正我,如果我错了,但我敢肯定,userId会不明确,这个声明不会运行。如果情况确实如此,那么@John Hartsocks的答案应该可行。

这是除了点虽然。如果您担心确保用户被完全删除,那么您应该使用外键约束。你说当你删除一个用户时,你要确保删除与该用户有关的所有信息。如果将FK约束添加到每个具有用户标识的表(除了用户表,在这种情况下,它将具有主键约束),则不应首先确保所有其他用户删除用户引用该用户的数据被删除。

+0

它会工作,查询是在一个PHP字符串。 – 2011-04-21 14:59:48

+0

我不是指$ userId,我指的是左侧的userId模糊。尽管人们可能会看到并认为它可行,但我很确定mySQL不会执行该声明。我相信在PHP方面,它会正确地构建查询(读取:字符串)。 – Dave 2011-04-21 15:07:48