2014-03-26 25 views
0

我有多個表,其中包含關於用戶和內容的信息。
從多個表中刪除MySQL可以在同一個表中的不同列中找到關鍵字

Table users: 
id  name 
5  foo 
33  abc 


Table imgs: 
id  uid img_name 
1  5  bar 
8  33  xy 


Table user_permissions: 
id  uid permission_id 
1  5   3 
2  3   3 


Table liked_content: 
id  contente_id content_holder_id  likedby_id 
1   8    33     5 
2   1     5     56 

如果用戶是德我想刪除所有與他的用戶ID相關的表中的所有行。如果我爲每個表只添加一列,這工作正常。

DELETE users, 
     imgs, 
     user-permissions, 
     liked_content 
FROM users, 
    imgs, 
    user-permissions, 
    liked_content 
WHERE imgs.uid = users.id AND 
     user_permissions.uid = users.id AND 
     liked_content.content_holder_id = users.id AND 
     users.id = 5 

添加WHERE子句中的第二行(likedby_id/liked_content表),其中的ID,可以發現將不起作用。

... 
WHERE imgs.uid = users.id AND 
     user_permissions.uid = users.id AND 
     liked_content.content_holder_id = users.id AND 
     liked_content.likedby_id = users.id AND 
     users.id = 5 

將正確的方式添加到列表中查詢的第二列是什麼?

回答

0

根據您的數據,用戶id可以在favorite_content表中,作爲content_holder_id bybyby_id。不一定都是。凡爲條款應改變:

... 
    WHERE imgs.uid = users.id AND 
    user_permissions.uid = users.id AND 
    (liked_content.content_holder_id = users.id OR 
    liked_content.likedby_id = users.id) AND 
    users.id = 5 

如果您一起使用外鍵約束級聯刪除規則,您不必手動執行此操作。

+0

完美!我在沒有括號的情況下嘗試了OR,但沒有奏效。 – uvo

0

你自己實現的是級聯刪除。它通常內置在數據庫引擎中。看看此相關的問題:MySQL foreign key constraints, cascade delete 如果你是在做自己死心塌地,我建議你多刪除遍歷您的架構從子到父事務中的語句:

DELETE 
FROM liked_content 
WHERE content_holder_id = 5; 

DELETE 
FROM imgs 
WHERE uid = 5; 

DELETE 
FROM user-permissions 
WHERE uid = 5; 

DELETE 
FROM users 
WHERE id = 5; 
+0

謝謝。 @ chameera-solution爲我工作。也許使用外鍵約束和級聯刪除是我無法實現它的正確方法。 – uvo

0

正如其他人所說的,技術上正確的方法是設置級聯刪除。

如果我負責數據庫,我不會願意這樣做,只是因爲你會發現它試圖操縱表格非常痛苦,尤其是當你試圖創建示例數據時。

我會去的KISS方法...

做了刪除每個下級表分別指的是用戶ID,然後刪除主記錄。

如果您執行外鍵和級聯事件,您將不會喜歡它對內容表的操作,因爲它與主用戶表有兩種關係。

這意味着,例如,如果您試圖刪除holder_id 5的內容行,您必須首先將這些行與關聯的likesby_id主記錄斷開連接,方法是將likesby_id設置爲NULL,否則級聯會刪除likesby_id主記錄。但是,它也不會允許你將vacnby_id NULL,因爲這樣做會使你實際執行級聯所需的外鍵關係無效。

幫你一個忙 - 簡單點。

相關問題