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

MySql触发删除同一表中的子记录,mysql,sql,database-design,triggers,mysql-error-1442,Mysql,Sql,Database Design,Triggers,Mysql Error 1442,我有一个存储父记录和子记录的表 我试图创建一个触发器,在删除父记录时删除所有子记录: Delete From tbl Where ParentId = OLD.Id 虽然我可以成功保存触发器,但删除时会出现以下错误: 错误1442:无法更新存储函数/触发器中的表“tbl”,因为调用此函数/触发器的语句已使用该表 我做错了什么?这似乎是: 不能删除表中的行 那触发了 您可能会考虑的其他一些选项: 编写删除父行和子行的应用程序逻辑,并在需要删除父记录时调用此应用程序逻辑,而不是直接删除它 在同一个

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

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

Delete From tbl Where ParentId = OLD.Id
虽然我可以成功保存触发器,但删除时会出现以下错误:

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

我做错了什么?

这似乎是:

不能删除表中的行 那触发了

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

  • 编写删除父行和子行的应用程序逻辑,并在需要删除父记录时调用此应用程序逻辑,而不是直接删除它
  • 在同一个表上级联删除关系,该关系为
  • 定期清除孤儿记录的清理过程
  • (由@Chris建议)通过添加另一个表将子记录与父记录分开

  • 美国。可以对同一表中的子记录执行
    删除级联
    。我找到了答案。这是我如何让它工作的

  • 我必须确保主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。通过添加另一个表将子记录与父记录分开。在我的情况下,4不是一个选项。你的第二个建议对我最有效。我不知道你可以在同一张桌子上做。谢谢