这是一个有效的MySQL查询吗?

时间:2011-04-21 14:48:33

标签: mysql sql

我有4个表:用户,消息,文件,备注。我想做一个查询,删除所有用户的东西,如果他被删除。以下是否有效:

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

所有4个表都有列userId

5 个答案:

答案 0 :(得分:5)

您可以将语句拆分为四个单独的语句,以删除与用户标识关联的行。

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来表示。这是一些参考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 :(得分: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的记录,否则不会删除任何内容。

但请注意,这不是非常有效,四次单独的删除会更好。

答案 2 :(得分:1)

在where语句中

,如果你有多个表引用,你应该引用TABLE.COLUMN, 例如:WHERE users.userid = '$userId'. 我建议每张桌子做一个句子

答案 3 :(得分:1)

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

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

答案 4 :(得分:-1)