2013-06-13 43 views
4

我有一個名爲具有collumns「itemID」和「parentID」的項目的表,其中parentID是來自表中另一行的ID。我想刪除parentID行不存在的行。家長不存在的Mysql刪除行

這就是我想出了:

DELETE FROM items 
WHERE (SELECT COUNT(1) 
     FROM items as parent 
     WHERE items.parentID=parent.itemID)=0 

,但我得到了以下錯誤:您不能在指定目標表「項目」的更新FROM子句

編輯:它如果鏈接到這個查詢刪除的項目的項目也將被查詢刪除,這將是很好的,這是可能的在SQL中,或者我應該編碼嗎?

回答

6

使用子查詢是不合適的;使用左聯同multiple-table syntax

DELETE items 
FROM items 
    left join items as parent 
     on items.parentID = parent.itemID 
WHERE parent.itemID is NULL 

多表語法允許您指定加入delete命令 - 這樣你就可以加入多個表和一個只能刪除。即DELETE t1 FROM t1 join t2 ....將加入t1t2,但只刪除表t1中的相應行。

至於你的問題「這將是很好,如果連接到這個查詢刪除項目的項目也將被刪除的查詢,這是可能的在sql中,或者我應該編碼?

我認爲這將結束與級聯 - 刪除的記錄可能是另一個記錄的父,所以刪除那一個,但也可以是另一個記錄的父,所以你也需要刪除它,等等。我認爲不可能通過單個SQL查詢來查詢所有級聯。

所以我認爲最簡單的解決方案是重新運行上述查詢,直到沒有行被刪除。

+0

謝謝你,它完美的作品!我將編寫一個重新運行的函數,直到沒有更多項目被刪除, – user2481664

2

查詢將被

DELETE items FROM items 
left join parent 
    on items.parentID = parent.ID 
WHERE parent.ID is NULL 
+1

將不起作用,因爲刪除需要知道從哪個表中刪除。您需要使用多表語法,請參閱我的答案。 – TMS

+0

@Tomas謝謝你的糾正。 :) –

+0

YogeshSuthar,歡迎:-) – TMS

0

試試下面這個小魔法...

delete from FooTable f1 where f1.parent_id 
     not in (select f2.item_id from FooTable f2); 

當然這個查詢有一個小問題,如果你是夏氏,你可能已經注意到,它可能在沒有父項的情況下生成新的FooRecords(這是在查詢執行過程中可能會刪除它們的父項)。

用手多次執行查詢,如果你不需要的東西自動,或將其放置在一個循環中,並停止循環時,刪除的記錄數爲0