MySql触发器删除同一个表中的子记录
问题描述:
我有一个表中存储父子记录。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
我做错了什么?
答
看来,这是not possible:
You cannot DELETE rows in the table that activated trigger.
你可能会想一些其他的选项:
即删除父和子行- 编写应用逻辑,并调用该应用程序的逻辑,只要你想要删除父记录,而不是直接删除它。
- 级联删除关系在同一张表上,其中appears to be possible。
- 通常清除孤儿子记录的清理过程。
- (由@Chris建议)通过添加另一个表,从父记录中分离出子记录。
答
s。可以在同一个表中执行子记录的Delete Cascade
。我发现this post in the MYSQL forums有答案。这是我如何运作的。
- 我不得不确保主ID的父母被设置为NULL。
- 我不得不确保主ID和父ID被设置为完全相同的字段类型,如INT。
- 我还必须确保主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.
这是巨大的我的项目,一个画廊,用户可以在相册内的相册内创建相册。
或4.通过添加另一个表从父记录中分离出子记录。 – 2011-05-04 15:32:30
4在我的情况下不是一个选项。你的第二个建议对我最有效。不知道你可以为同一张桌子做。谢谢! – IgalSt 2011-05-04 15:52:44