MySQL:从两个表中的任何一个删除行

时间:2018-07-25 02:40:20

标签: php mysql

我有两个这样的表设置:

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

这在以下情况下将非常有用:

  1. 如果该用户位于user_users中,但该用户在user_meta中不存在任何行
  2. 如果该用户存在于user_users中,并且该用户在user_meta中存在行

问题在于,如果(出于某种原因)user_meta中存在用户ID,而user_users中不存在用户ID,则不会从user_meta表中删除行。

出于所有实际原因,此查询应该在所有情况下都可以工作(因为如何为不存在的用户保存用户元数据?),但以防万一,我想确保该查询还会使用user_meta删除UserID表中的所有行,即使该用户不在user_users表中也是如此。

因此,我希望此查询删除带有user_meta的{​​{1}}表中的所有行,但是没有,因为{{ 1}}表:

UserID = 99

无论ID是否存在于其他任何一个表中,如何更新此查询以从其中一个/两个表中删除?

1 个答案:

答案 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中的所有子记录被删除。