2011-05-04 110 views
2

我有一個表中存儲父子記錄。MySql觸發器刪除同一個表中的子記錄

我試圖創建一個觸發器,它會刪除所有子記錄當父被​​刪除:

Delete From tbl Where ParentId = OLD.Id 

雖然我可以成功地保存觸發器,當刪除我得到這個錯誤:

ERROR 1442: Can’t update table ‘tbl′ in stored function/trigger because it is already used by statement which invoked this

我做錯了什麼?

回答

6

看來,這是not possible

You cannot DELETE rows in the table that activated trigger.

你可能會想一些其他的選項:

即刪除父和子行
  1. 編寫應用邏輯,並調用該應用程序的邏輯,只要你想要刪除父記錄,而不是直接刪除它。
  2. 級聯刪除關係在同一張表上,其中appears to be possible
  3. 通常清除孤兒子記錄的清理過程。
  4. (由@Chris建議)通過添加另一個表,從父記錄中分離出子記錄。
+1

或4.通過添加另一個表從父記錄中分離出子記錄。 – 2011-05-04 15:32:30

+0

4在我的情況下不是一個選項。你的第二個建議對我最有效。不知道你可以爲同一張桌子做。謝謝! – IgalSt 2011-05-04 15:52:44

0

s。可以在同一個表中執行子記錄的Delete Cascade。我發現this post in the MYSQL forums有答案。這是我如何運作的。

  1. 我不得不確保主ID的父母被設置爲NULL。
  2. 我不得不確保主ID和父ID被設置爲完全相同的字段類型,如INT。
  3. 我還必須確保主ID設置爲自動增量。

從MySQL論壇:

create table edges(
    ID int PRIMARY KEY, 
    parentid int, 
    unique key(id, parentid), 
    foreign key(parentID) references edges(ID) ON DELETE CASCADE ON UPDATE CASCADE 
) engine=innodb; 

insert into edges(ID,parentID) values (1,null),(2,1),(3,1),(4,2); 

現在做到這一點,看着父母和所有兒童刪除級聯:

delete from edges where id=2; 

select * from edges will then show two records left. Record 1 and record 3. 

這是巨大的我的項目,一個畫廊,用戶可以在相冊內的相冊內創建相冊。