2015-09-28 93 views
2

我有這些表,我試圖運行多刪除查詢刪除修復記錄時,將刪除所有的產品和任務。 注意,鏈接表具有ON DELETE CASCADE約束。的MySQL從多個表中刪除一個查詢

現在我遇到的問題是,當我運行此查詢時,它僅刪除repair,taskRepair(1個任務記錄,但它總共有3個)以及與已刪除任務關聯的產品。

DELETE bp, t, r 
FROM repair AS r 
LEFT JOIN taskRepair AS tr ON r.repairID = tr.repairID 
INNER JOIN task AS t ON t.taskID = tr.taskID 
LEFT JOIN boughtProductTask AS bpt ON bpt.taskID = t.taskID 
INNER JOIN boughtProduct AS bp ON bp.boughtProductID = bpt.boughtProductID 
WHERE r.repairID = ? 

我做了修改這一個SELECT查詢變化DELETE bp, t, rSELECT *並沒有返回的所有記錄。所以我的問題是這個查詢有什麼問題?

Database Tables

+0

我猜測,最後的'內join'應'留下join',因爲它變成早期外連接到內連接。 –

+0

@GordonLinoff與{INNER JOIN}相同的結果 – Joseph118

回答

0

我相信,在這種情況下,最好的做法是定義與ON DELETE CASCADE選項對錶的外鍵約束。

這種方式刪除從父表中的記錄中刪除從子表中的記錄,而你只需要只要有關係,處理一個。


如果您仍然在尋找使用查詢執行多次刪除,它似乎是可能的,但不使用新的語法連接。從manual

您可以在DELETE語句中指定多個表以從一個或多個表中刪除行,具體取決於WHERE子句中的特定條件。但是,您不能在多表DELETE中使用ORDER BY或LIMIT。 table_references子句列出了連接中涉及的表。其語法在第12.2.8.1節「JOIN語法」中描述。

該手冊包括一個例子,以及:

DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3 
WHERE t1.id=t2.id AND t2.id=t3.id; 

我希望沿着以下線的東西會爲你工作(我還沒有數據庫,所以我不能真正測試查詢):

DELETE bp, t, r 
FROM repair AS r, taskRepair AS tr 
INNER JOIN task AS t ON t.taskID = tr.taskID 
LEFT JOIN boughtProductTask AS bpt ON bpt.taskID = t.taskID 
INNER JOIN boughtProduct AS bp ON bp.boughtProductID = bpt.boughtProductID 
WHERE r.repairID = tr.repairID AND r.repairID = ? 

編輯 - 第二個建議:

DELETE bp, t, r 
FROM repair AS r, 
    task AS t, 
    taskRepair AS tr, 
    boughtProduct AS bp 
LEFT JOIN boughtProductTask AS bpt ON bpt.taskID = t.taskID 
WHERE r.repairID = tr.repairID 
     AND t.taskID = tr.taskID 
     AND bp.boughtProductID = bpt.boughtProductID 
     AND r.repairID = ? 

注意我是如何與taskRepair改變JOIN到另一個表中FROM列表,並添加條件一路下來WHERE子句中。


來源:

+0

至於你的第一個答案,我的鏈接表上的主鍵也作爲一個外鍵,對它們具有ON DELETE CASCADE約束。我希望我所需要做的就是刪除父母...我測試了您的查詢,並返回了與我的查詢相同的結果..但我會嘗試對您的查詢進行一些修改,但是,您給了我一些想法 – Joseph118

+0

嘿@Joseph118,我在答案中增加了第二個建議。讓我知道。 – Selfish

+0

錯誤...'未知列't.taskID''在'子句''..它對我沒有任何意義 – Joseph118