我有4个表:用户,消息,文件,备注。我想做一个查询,删除所有用户的东西,如果他被删除。以下是否有效:
DELETE FROM users, messages, files, notes WHERE userId = '$userId'
所有4个表都有列userId
答案 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)
,如果你有多个表引用,你应该引用TABLE.COLUMN,
例如:WHERE users.userid = '$userId'.
我建议每张桌子做一个句子
答案 3 :(得分:1)
在你的WHERE中,你有userId ='$ userId'。如果我错了,其他人可以纠正我,但我很确定userId是不明确的,并且这个声明不会运行。如果确实如此,@ John Hartsocks的答案应该有效。
这是除了这一点。如果您担心确保用户被完全删除,那么您应该使用外键约束。您说当您删除用户时,您希望确保删除与该用户相关的所有信息。如果将FK约束添加到具有用户标识的每个表(除了用户表,在这种情况下它将具有主键约束),则不应该首先确保所有其他用户删除用户引用该用户的数据。
答案 4 :(得分:-1)