代码之家  ›  专栏  ›  技术社区  ›  MultiDev

mysql:删除两个表中的任意一个表中的行

  •  0
  • MultiDev  · 技术社区  · 7 年前

    我有两张这样的桌子:

    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
    

    因此,在 用户元 表属于给定的 UserID . 删除用户时,还需要删除 用户元 属于该用户的表。

    以下是我的资料:

    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. 如果用户存在于 用户用户 但中不存在此用户的行 用户元
    2. 如果用户存在于 用户用户 中存在此用户的行 用户元

    问题是,如果(出于某种原因)用户ID存在于 用户元 但不在 用户用户 ,行不会从 用户元 表。

    出于所有实际原因,此查询 应该 在所有情况下都可以工作(因为如何为不存在的用户保存用户meta?),但为了以防万一,我想确保查询还将删除 用户元 表与 用户标识 即使该用户不存在于 用户用户 表。

    因此,我希望此查询删除 用户元 表与 UserID = 99 但是没有,因为没有 ID 其中99个存在于 用户用户 表:

    DELETE user_users, user_meta FROM user_users LEFT JOIN user_meta ON user_meta.UserID = user_users.ID WHERE user_users.ID = 99
    

    如何更新此查询以从其中一个/两个表中删除,而不管ID是否存在于另一个表中?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Tim Biegeleisen    7 年前

    这种情况很适合使用级联删除约束。你想要儿童档案在 user_meta 每当父记录位于 user_users 被删除。假设在 UserID 用户元 表,您可以尝试:

    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 语句。

    有了这个约束,就可以从中删除用户记录 用户用户 将自动导致中的所有子记录 用户元 被删除。

    推荐文章