2010-01-06 26 views
5

我試圖根據第三個表ID刪除兩個從屬表中的所有行。[MySQL]:從兩個從屬表中刪除行

表結構:

Transaction 
-Transaction_ID (primary) 
-Timestamp 

Purchase 
-Item_ID 
-Transaction_ID 
-Purchase_ID (primary) 

Item 
-Item_ID (primary) 
-Client_ID 

我想刪除交易/購買項目匹配CLIENT_ID的所有行。聽起來很簡單......雖然我可以總結我的腦海新手圍繞...

DELETE dbName.t FROM 
    dbName.Transaction t 
JOIN 
    dbName.Purchase p 
ON 
    p.Transaction_ID = t.Transaction_ID 
JOIN 
    dbName.Item i 
ON 
    p.Item_ID = i.Item_ID 
WHERE 
    Client_ID = 1 

都能跟得上......

我得到這個錯誤foreign key constraint fails... - 我敢肯定,你們中許多人並不感到驚訝。

購買使用t.Transaction_ID是否存在問題? - (因此,這個外鍵會失敗)

或者有可能在這個表中有其他t.Transaction_ID相關的數據(我還沒有找到任何)。

編輯:COMPLETE ERROR

Cannot delete or update a parent row: a foreign key constraint fails 
(`ItemTracker_dbo/Purchase`, CONSTRAINT `FK_Purchase_Transaction` 
FOREIGN KEY (`Transaction_ID`) REFERENCES `Transaction` (`Transaction_ID`) 
ON DELETE NO ACTION ON UPDATE CASCADE) 

回答

4

只要依賴記錄仍存在於另一個表中,則無法從表中刪除。在你的情況下,依賴是這樣的

Transaction <- Purchase -> Item 

因此,您需要先刪除任何購買,然後才能刪除交易。

作爲替代的是分兩步走的辦法,我建議設立一個ON DELETE CASCADE constraint以及與此去:

DELETE 
    Transaction 
WHERE 
    Transaction_ID IN (
    SELECT 
     Transaction_ID 
    FROM 
     Purchase INNER JOIN Item ON Item.Item_ID = Purchase.Item_ID 
    WHERE 
     Item.Client_ID = <your Client ID here> 
) 

當心,這將刪除任何Transaction(並通過CASCADE,任何Purchase)那裏是一個相關的Item,匹配Client_ID,無論其中是否有其他項。如果這不是你想要的,那麼這個問題就需要進一步完善。

+0

對我來說,它似乎是相反的 - 交易是依賴於購買(因爲我不能刪除client_id W/O它) – 2010-01-06 16:23:39

+0

@Derek Adair:由於@AlbertEin是第一個正確回答這個問題,我的職位需要一個大的改革在它有用之前,請考慮接受他的答案。 – Tomalak 2010-01-06 17:12:27

+0

仔細看,您的購買表中有一個Transaction_ID。如果您先刪除了事務,那麼Purchase表將臨時包含一個不存在的無效Transaction_ID。 – MindStalker 2010-01-06 17:38:26

2
Transaction <- Purchase -> Item 

你的問題是,你正在試圖刪除購買,這樣做是刪除購買,然後才交易的正確的方法之前刪除的交易,即,或者你可以在你的外鍵上使用ON DELETE CASCADE,看來你正在使用ON DELETE RESTRICT

在這裏看到:http://dev.mysql.com/doc/refman/5.0/es/innodb-foreign-key-constraints.html

此外,如果你wan't,以確保這就是你應該給完全錯誤的原因,DBMS通常只是告訴你什麼外鍵衝突是提高錯誤。

UPDATE:你的錯誤就明確,問題是,你首先刪除購買,然後交易,你需​​要向後做,或設置ON DELETE CASCADE你的外鍵約束

+0

我的回答下面的評論現在是一個紅色的鯡魚。我們應該刪除它們嗎? – Tomalak 2010-01-06 16:50:44

+0

對我來說沒有問題。所以,如果你刪除它們,我也會刪除它們;) – albertein 2010-01-06 16:53:41

+0

好的,現在刪除。當我們完成時,我會向你的答案發佈一個建議,因爲你在我之前就已經掌握了。 – Tomalak 2010-01-06 17:01:17