触发错误,MySQL

时间:2012-02-01 14:20:38

标签: mysql sql triggers

好吧,我已经研究过并且没有找到解决以下问题的解决方案'SQL Error (1442): Can not update table' messages' in stored function / trigger because it is already used by statement Which invoked this stored function / trigger.`

我的触发器已创建,只有当我在消息表上运行INSERT时,才会抛出此错误,我的触发器是

DELIMITER $$ 
DROP TRIGGER IF EXISTS `onMessage` ;
CREATE TRIGGER `onMessage` BEFORE INSERT ON `messages` FOR EACH ROW 
BEGIN
       UPDATE `users` SET `users`.`messages` = ( `users`.`messages` + 1 ) 
       WHERE `users`.`uid` = NEW.uid ;
       DELETE FROM `messages` WHERE `date` < ( NOW( ) - INTERVAL 1 MINUTE ) ;
END ;
$$
DELIMITER ;

3 个答案:

答案 0 :(得分:4)

这是使用触发器的限制。

来自MySql documentations

  

在存储的函数或触发器中,不允许通过调用函数或触发器的语句修改已经使用(用于读取或写入)的表。

答案 1 :(得分:2)

正确,对于MySQL无论如何

您无法写入与该触发器中的触发器关联的表。它会产生各种不一致的情况,尤其是因为MySQL触发器是逐行处理的(RBAR)

在这种情况下,我将使用存储过程来处理messages上的INSERT

答案 2 :(得分:0)

由于Mysql在该表上执行某些锁定操作,因此无法更新在触发器中为其创建触发器的表。因此,您无法插入/更新/删除同一个表的行,因为这样会一次又一次地调用触发器,最终会导致递归。

如果你想在桌子上创建一个自动更新的触发器(在这种情况下进行删除),请确保在更新后使用NEW.column_name来引用该行。