我有两个这样的表设置:
user_users
ID ColA ColB
55 This That
56 Other Stuff
user_meta
ID UserID MetaName MetaValue
1 56 some_name some_value
2 56 other_name other_vaue
3 99 this_too equals_this
因此,user_meta
表中可以有多行归因于给定的UserID
。删除用户时,我还需要删除user_meta
表中归因于该用户的所有行。
这就是我所拥有的:
DELETE user_users, user_meta FROM user_users LEFT JOIN user_meta ON user_meta.UserID = user_users.ID WHERE user_users.ID = 56
这在以下情况下将非常有用:
user_users
中,但该用户在user_meta
中不存在任何行user_users
中,并且该用户在user_meta
中存在行问题在于,如果(出于某种原因)user_meta
中存在用户ID,而user_users
中不存在用户ID,则不会从user_meta
表中删除行。
出于所有实际原因,此查询应该在所有情况下都可以工作(因为如何为不存在的用户保存用户元数据?),但以防万一,我想确保该查询还会使用user_meta
删除UserID
表中的所有行,即使该用户不在user_users
表中也是如此。
因此,我希望此查询删除带有user_meta
的{{1}}表中的所有行,但是没有,因为{{ 1}}表:
UserID = 99
无论ID是否存在于其他任何一个表中,如何更新此查询以从其中一个/两个表中删除?
答案 0 :(得分:1)
这种情况很适合使用级联删除约束。您希望每删除user_meta
中的父记录时都删除user_users
表中的子记录。假设UserID
表中的user_meta
上已经有外键约束,则可以尝试:
ALTER TABLE user_meta DROP FOREIGN KEY user_id_key;
ALTER TABLE user_meta
ADD CONSTRAINT user_id_key
FOREIGN KEY (UserID) REFERENCES user_users (ID)
ON DELETE CASCADE;
这假定您已经在user_meta#UserID
上具有外键约束。如果没有,请忽略第一个ALTER TABLE
语句。
有了此约束,从user_users
删除用户记录将自动导致user_meta
中的所有子记录被删除。