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

标签 mysql triggers

我正在运行 MySQL 5.5.9 和 InnoDB。

我尝试创建一个版本控制表,其中 current 字段指示记录是否是最新版本。像这样的东西:

| autonumber | id | name | current
| 1          | 1  | Yes  | 0
| 2          | 1  | No   | 1

无论如何,我过去在 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;
|

这运行正常,但是在插入记录时:

insert into Products (id, name)
values (1, "Hello SO!");

我收到以下错误:

Error Code: 1442. Can't update table 'Products' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

是否有解决此问题的方法来实现类似的目标?

最佳答案

取自此处http://forums.mysql.com/read.php?99,122354,122505#msg-122505

when you insert a record mysql is doing some lock stuff. you can't insert/update/delete rows of the same table where you insert.. because then the trigger would called again and again.. ending up in a recursion

关于mysql - 无法更新在 AFTER INSERT 中执行触发器的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9227382/

相关文章:

wpf - 从一种样式到另一种样式进行动画处理

mysql - 触发列值更改?

mysql - phpMyAdmin 触发 gui 检查年龄

mysql - SQL:查询客户销售分类帐

MySQL - 是否必须在两台服务器上启用联合引擎?

php - Doctrine2 QB OneToMany 连接上的语义错误

mysql - 按顺序使用最大列值

mysql - 在Mysql中添加新列时如何轻松维护审计触发器

php - 将纪元时间转换为 H :mm timestamp in PHP

c# - 如何使用触发器在 Setter Value 属性上绑定(bind)另一个控件?