1

在插入之前我有一个触发器来进行一些验证。如果不满足验证,我想阻止插入并将数据插入另一个表。我曾尝试使用来完成此操作,signal sqlstate但是当发生这种情况时,会发生回滚,不会将数据插入到另一个表中。

delimiter $$
create trigger tr_example_before_ins before insert on example
for each row
begin
    if example.price < 10000 then
        insert into example_log(example_id, notes)values(new.example_id, "WORKED");
        signal sqlstate '45000';
    end if;
end$$
delimiter ;

反正有没有停止插入而不使用signal sqlstate所以我仍然可以将数据插入另一个表?

4

1 回答 1

2

您正在寻找的东西有时被称为“代替”触发器。也就是说,它插入到表中example_log,但不插入到产生触发器的表中,example.

MySQL 不支持“代替”触发器,例如 Microsoft SQL Server 支持:https ://www.sqlservertutorial.net/sql-server-triggers/sql-server-instead-of-trigger/

如果触发器被中止,则由触发器执行的所有操作以及产生触发器的操作也将被中止。如果不提交所有这些,就无法提交其中的一些。

因此,您要做的唯一选择是从运行插入的客户端插入日志表example

于 2021-09-01T22:22:45.223 回答