Mysql Can';t在插入后更新在中执行触发器的表

Mysql Can';t在插入后更新在中执行触发器的表,mysql,triggers,Mysql,Triggers,我正在运行MySQL 5.5.9和InnoDB 我尝试创建一个版本表,其中current字段指示记录是否为最新版本。比如: | autonumber | id | name | current | 1 | 1 | Yes | 0 | 2 | 1 | No | 1 无论如何,我过去在MSSQL中经常通过插入后的触发器来实现这一点,该触发器将具有相同id的所有记录更新为current=0。现在我们进入MySQL: DELIMITER | CREATE

我正在运行MySQL 5.5.9和InnoDB

我尝试创建一个版本表,其中
current
字段指示记录是否为最新版本。比如:

| autonumber | id | name | current
| 1          | 1  | Yes  | 0
| 2          | 1  | No   | 1
无论如何,我过去在MSSQL中经常通过插入后的
触发器来实现这一点,该触发器将具有相同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;
|
我得到以下错误:

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


有没有办法实现类似的功能?

在MySQL中,不可能更新在触发器中为其创建触发器的表(“产品”)

根据MySQL文档,生成此错误是为了防止无限递归:当发生更新时,将运行触发器并更新表,此触发器更新会导致触发器一次又一次地运行,最终导致无限循环。

从这里开始


当您插入一条记录时,mysql正在执行一些锁定操作。你不能 插入/更新/删除插入..的同一表的行。。因为 然后触发器会一次又一次地调用。。最后在一个 递归


当您插入一条记录时,mysql正在执行一些锁定操作。不能在插入的表中插入/更新/删除行。。因为那样触发器就会一次又一次地被调用。。以递归结束

我曾经有过这个问题。我删除了更新命令。那么,试试这个:

DELIMITER |

CREATE TRIGGER TRIGGER_Products_UpdateEarlierVersions AFTER INSERT ON Products
FOR EACH ROW BEGIN

    SET current = 0
    WHERE   id = new.id
        AND current = 1
        AND autonumber <> new.autonumber;
END;
|
分隔符|
在产品上插入后创建触发器触发器产品更新ArlierVersions
每行开始
设置电流=0
其中id=new.id
电流=1
和自动编号new.autonumber;
结束;
|

我想这会管用的

这是5年前的事了,但我遇到了与OP相同的问题,最后来到了这里,通过@Sergey Benner链接到forum.mysql.com,发现了以下内容:

我知道这是一篇老文章,但我无意中找到了答案,并想与大家分享。在插入/更新过程中,您可以访问包含表中所有字段的新对象。如果在插入/更新和编辑要在新对象中更改的字段之前执行,它将成为调用语句的一部分,而不是单独执行(消除递归) 前

在更新测试之前创建触发器测试

每行

设置NEW.updateTime=NOW()

让OP感到悲哀的是,这篇文章来自2008年3月18日,比这篇文章早很多年。我猜其他回复的成员只是没有深入到forum.mysql线程中去发现这一点。那个论坛有一个非常不友好的介绍——毫无规则可言


我已经在我的环境中测试过了,效果非常好。我不喜欢被称为“喜欢触发”,但如果帽子合适的话…

这就是错误所说的,但我正在寻找一种解决方法。最终尝试在触发之前使用,在触发产生同样的效果之前,但这不是一个选项,因为在这种情况下,失败的INSERT语句会破坏数据库。如果将数据库放入事务中,失败的INSERT语句如何破坏数据库?您正在锁定它:))如果更新某个数据库,它就会被锁定。行、页、表等。正如我写的,在触发前尝试使用。
DELIMITER |

CREATE TRIGGER TRIGGER_Products_UpdateEarlierVersions AFTER INSERT ON Products
FOR EACH ROW BEGIN

    SET current = 0
    WHERE   id = new.id
        AND current = 1
        AND autonumber <> new.autonumber;
END;
|