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)?
MariaDB 触发器在同一张表上执行 UPDATE 和 INSERT