2011-05-04 88 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. 

这是巨大的我的项目,一个画廊,用户可以在相册内的相册内创建相册。