3

我有一个存储父子记录的表。

我试图创建一个触发器,该触发器将在删除父项时删除所有子记录:

Delete From tbl Where ParentId = OLD.Id

虽然我可以成功保存触发器,但删除时出现此错误:

错误 1442:无法更新存储函数/触发器中的表“tbl”,因为它已被调用此函数的语句使用

我究竟做错了什么?

4

2 回答 2

7

看来这是不可能的

您不能删除激活触发器的表中的行。

您可能会考虑的其他一些选项:

  1. 编写删除父行和子行的应用程序逻辑,并在要删除父记录时调用此应用程序逻辑,而不是直接删除它。
  2. 同一张表上的级联删除关系,这似乎是可能的
  3. 定期清除孤儿记录的清理过程。
  4. (@Chris 建议)通过添加另一个表将子记录与父记录分开。
于 2011-05-04T15:24:15.027 回答
0

s。可以在同一个表中做一个Delete Cascade子记录。我在 MYSQL 论坛上发现这个帖子有答案。这是我如何让它工作的。

  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.

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

于 2015-12-31T16:28:06.877 回答