这是一个有效的MySQL查询吗?
我有4个表:用户、消息、文件、注释。我想做一个查询,如果一个用户被删除了,它将删除他的所有内容。将进行以下工作:这是一个有效的MySQL查询吗?,mysql,sql,Mysql,Sql,我有4个表:用户、消息、文件、注释。我想做一个查询,如果一个用户被删除了,它将删除他的所有内容。将进行以下工作: DELETE FROM users, messages, files, notes WHERE userId = '$userId' 所有4个表都有一列userId您可以将语句拆分为四个单独的语句,以便删除与userId关联的行 DELETE FROM users WHERE userId = '$userId' DELETE FROM messages WHERE userId
DELETE FROM users, messages, files, notes WHERE userId = '$userId'
所有4个表都有一列
userId
您可以将语句拆分为四个单独的语句,以便删除与userId关联的行
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语句中,如果有多个表引用,则应参考table.COLUMN, 例如:
WHERE users.userid='$userid'。
我建议每个表格写一句话是的
这假设id=1
的记录存在于users
中,否则不会删除任何内容
但是,请注意,这不是很有效,四次单独的删除效果会更好。在WHERE中,您有userId='$userId'。如果我错了,其他人可以纠正我,但我非常确定用户ID是不明确的,并且该语句不会运行@如果确实如此,约翰·哈特索克的答案应该是可行的
但这不是重点。如果您担心确保用户被完全删除,那么应该使用外键约束。您说过,删除用户时,您希望确保删除与该用户相关的所有信息。如果将FK约束添加到每个具有用户id的表中(除了users表之外,在这种情况下,它将具有主键约束),则在不首先确保删除引用该用户的所有其他数据之前,您不可能删除该用户。您说“以下操作可行吗?”你为什么不先试试自己?@Naveed我在这个网站上没有看到一条规定,当我问问题时,你要纳税。没有。您链接到的文档表明,从多个表中删除时必须使用USING子句。Err。。否..多表语法:删除[LOW_PRIORITY][QUICK][IGNORE]tbl_name[.*][,tbl_name[.*]]。。。从表[WHERE\u条件]中,是否有机会消除所有负面影响?以消除反对票?我试过了,但除非答案被编辑,否则无法完成。啊哈,原来我可以自己编辑;所以一票否决removed@Johan:因为如果在至少一个表中没有
user_id=1
的记录,内部联接将不会删除任何内容。我指的不是$userId,而是左侧的userId不明确。尽管人们可能会认为这是可行的,但我很确定mySQL不会执行该语句。我相信在php方面,它会正确地构建查询(read:string)。
[CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name, ...)
REFERENCES tbl_name (index_col_name,...)
[ON DELETE reference_option]
[ON UPDATE reference_option]
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