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

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

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

Delete From tbl Where ParentId = OLD.Id

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

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

我做错了什么?

【问题讨论】:

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


    【解决方案1】:

    看来这是not possible

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

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

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

    【讨论】:

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

    s。可以在同一个表中对子记录进行Delete Cascade。我发现this post in the MYSQL forums 有答案。这是我如何让它工作的。

    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.
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-02
      • 1970-01-01
      • 2015-02-13
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多