MySql 触发器删除同一张表中的子记录

Posted

技术标签:

【中文标题】MySql 触发器删除同一张表中的子记录【英文标题】:MySql Triggers to delete child records in the same table 【发布时间】:2011-05-04 15:15:24 【问题描述】:

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

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

Delete From tbl Where ParentId = OLD.Id

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

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

我做错了什么?

【问题讨论】:

【参考方案1】:

看来这是not possible:

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

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

    编写删除父行和子行的应用程序逻辑,并在您想要删除父记录时调用此应用程序逻辑,而不是直接删除它。 同一张表的级联删除关系,appears to be possible。 定期清除孤立子记录的清理过程。 (@Chris 建议)通过添加另一个表将子记录与父记录分开。

【讨论】:

或4.通过添加另一个表将子记录与父记录分开。 4 在我的情况下不是一个选项。你的第二个建议对我最有效。不知道你可以为同一张桌子做。谢谢!【参考方案2】:

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.

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

【讨论】:

以上是关于MySql 触发器删除同一张表中的子记录的主要内容,如果未能解决你的问题,请参考以下文章

如何使用触发器在同一张表中插入新行(Oracle PL/SQL 10G)?

MySQL中如何在关联表中查询出其中一个外键不存在的数据?

MariaDB 触发器在同一张表上执行 UPDATE 和 INSERT

想写一个DB2触发器,几张表有关联,修改其中一张主表中的某一个字段,其他关联表中的该字段也跟着联动修改

mysql中的触发器

MySQL如何创建一个触发器,功能是在一张表中insert一条数据,另一张表中的数据相应地进行update。