簡體   English   中英

MySQL:從兩個表之一刪除行

[英]MySQL: Delete rows from either of two tables

我有兩個這樣的表設置:

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

的問題是,如果(由於某種原因)中存在的用戶ID user_meta但不是在user_users ,行不從除去user_meta表。

出於所有實際原因,此查詢應該在所有情況下都可以工作(因為您將如何為不存在的用戶保存用戶元數據?),但以防萬一,我想確保該查詢還可以刪除user_meta中的任何行如果用戶在user_users表中不存在,則該表具有UserID

所以,我想這個查詢在刪除任何行user_meta與表UserID = 99 ,但它沒有,因為沒有ID的99中存在user_users表:

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?

這種情況是使用級聯刪除約束的良好選擇。 要在子記錄user_meta表每當父記錄被刪除user_users被刪除。 假設user_meta表中的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語句。

在此約束下的地方,從刪除用戶記錄user_users會自動導致所有子記錄user_meta被刪除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM