【问题标题】:How to write trigger for after delete which contains another deletion for the same table in the trigger body?如何为删除后的触发器编写触发器,其中包含触发器主体中同一个表的另一个删除?
【发布时间】:2021-05-25 12:48:08
【问题描述】:

以下是关系模式,

college(ID int, name text, grade int);
friend(ID1 int, ID2 int);
likes(ID1 int, ID2 int);

我写了一个触发器来保持友谊关系的对称性。这意味着如果(X,Y)从朋友中删除,(Y,X)也应该被删除。

以下是表格的创建;

create table college
(
    id    int auto_increment primary key,
    name  text not null,
    grade int  not null
);

create table likes
(
    id1 int not null,
    id2 int
);

create table friend
(
    id1 int not null,
    id2 int not null,
    constraint friend_pk
        primary key (id1, id2),
    constraint friend_college_id_fk
        foreign key (id1) references college (id)
    constraint friend_college_id_fk2
        foreign key (id2) references college (id)
);

我写了以下触发器;

delimiter //
drop trigger if exists Friend_Delete //
create trigger Friend_Delete
    after delete
    on friend
    for each row
begin
    delete
    from friend
    where id1 = OLD.id2
      and id2 = OLD.id1;
end //
delimiter ;

但是当我执行以下查询时,

delete from friend where id1 = 1 and id2 = 2;

它给了我这个结果; 无法更新存储函数/触发器中的表“朋友”,因为它已被调用此存储函数/触发器的语句使用

我用谷歌搜索了这个问题,它被称为发生了无休止的递归调用。但是当我们说delete之后就被删除了,为什么这里不能再删除呢?

【问题讨论】:

  • 你想要这样做的事实表明你有一个设计缺陷

标签: mysql sql database triggers mariadb


【解决方案1】:

数据库引擎确保您不能编写触发永无止境的触发器序列的触发器。它不是查看代码的逻辑,它只是确保您不会触发一系列持续运行的触发操作。是否在原始删除“之后”并不重要。

一般来说,我建议在应用程序代码中处理这个问题,而不是在数据库代码中。触发器有很多问题——它们很难测试,它们很难调试,它们需要开发人员记住做一件事(在这种情况下删除一行)有副作用(自动删除另一行),他们可能会产生奇怪的性能问题(触发的级联序列可能看起来您的数据库很慢)。

【讨论】:

    【解决方案2】:
    delete from friend where id1 = 1 and id2 = 2;
    

    通过上述查询,您将删除 id1 =1 和 id2= 2 的行

    然后触发器试图删除所有 id1=2 和 id2=1

    的行

    这也会触发 Friend_Delete 删除 id1=1 和 id2=2 的行,这是您使用的第一个删除条件。 所以这种方式递归正在发生并创建了一个无限循环。

    【讨论】:

    • 我们可以为此编写一个触发器吗?
    • 会尝试找到一些东西。但我建议使用:从 id1 = 1 和 id2 = 2 的朋友中删除;从 id1 = 2 和 id2 = 1 的朋友中删除;从前端;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 2021-07-29
    相关资源
    最近更新 更多