无法更新在 AFTER INSERT 中执行触发器的表

Jan*_*oom 5 mysql triggers

我正在运行 MySQL 5.5.9 和 InnoDB。

我尝试创建一个版本化表,其中该current字段指示记录是否是最新版本。就像是:

| autonumber | id | name | current
| 1          | 1  | Yes  | 0
| 2          | 1  | No   | 1
Run Code Online (Sandbox Code Playgroud)

无论如何,我过去在 MSSQL 中经常通过AFTER INSERT触发器将具有相同 id 的所有记录更新为current = 0. 所以我们在 MySQL 中进行:

DELIMITER |

CREATE TRIGGER TRIGGER_Products_UpdateEarlierVersions AFTER INSERT ON Products
FOR EACH ROW BEGIN
    UPDATE Products
    SET current = 0
    WHERE   id = new.id
        AND current = 1
        AND autonumber <> new.autonumber;
END;
|
Run Code Online (Sandbox Code Playgroud)

这运行良好,但在插入记录时:

insert into Products (id, name)
values (1, "Hello SO!");
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

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

有没有办法解决这个问题来实现类似的事情?

Ser*_*ner 4

摘自这里http://forums.mysql.com/read.php?99,122354,122505#msg-122505

当你插入一条记录时,mysql正在做一些锁定的事情。您无法在插入的同一个表中插入/更新/删除行..因为这样触发器会一次又一次地调用..最终导致递归