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

时间:2011-05-04 15:15:24

标签: mysql sql database-design triggers mysql-error-1442

我有一个表,用于存储父记录和子记录。

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

Delete From tbl Where ParentId = OLD.Id

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

  

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

我做错了什么?

2 个答案:

答案 0 :(得分:6)

这似乎是not possible

  

您无法删除表格中的行   激活了触发器。

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

  1. 编写删除父行和子行的应用程序逻辑,并在想要删除父记录时调用此应用程序逻辑,而不是直接删除它。
  2. 同一个表上的级联删除关系,appears to be possible
  3. 清理过程,通常清除孤立的子记录。
  4. (由@Chris建议)通过添加另一个表来从父记录中分离出子记录。

答案 1 :(得分:0)

秒。可以在同一个表中执行Delete Cascade个子记录。我发现this post in the MYSQL forums有答案。以下是我如何使用它。

  1. 我必须确保将主要ID的父级设置为NULL。
  2. 我必须确保将主要ID和父ID设置为完全相同的字段,例如INT。
  3. 我还必须确保将主要ID设置为自动增量。
  4. 来自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.
    

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