首页,MySQL不允许在触发器中对触发器本身绑定的表进行操作,否则会有如下报错:

[Err] 1442 - Can't update table 'sss' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

当sss这个表的c1字段值为2或3时,要求自动设置c2字段的值为1,否则字段设置为0。当然,要求新增和修改的时候,都要能够同步操作。

DROP TRIGGER tri_sss;

delimiter $$

CREATE TRIGGER `tri_sss` BEFORE INSERT ON ss FOR EACH ROW

BEGIN

IF NEW.c1 = 2 || NEW.c1 = 3 THEN

SET new.c2 = 1;

ELSE

SET new.c2 = 0;

END IF;

END

$$

delimiter ;

DROP TRIGGER tri_sss_UPDATE;

delimiter $$

CREATE TRIGGER `tri_sss_UPDATE` BEFORE UPDATE ON ss FOR EACH ROW

BEGIN

IF NEW.c1 = 2 || NEW.c1 = 3 THEN

SET new.c2 = 1;

ELSE

SET new.c2 = 0;

END IF;

END

$$

delimiter ;

大概看明白了,上面两个触发器,一个是管insert,另一个管update。当NEW.c1为2或3时,执行new.c2 = 1。当然这中间最重要的一点是“BEFORE”,在INSERT和UPDATE之前都有一个BEFORE,绝对不能写成AFTER了。就是说,我们这个操作,是在真正插入之前进行,而不是在插入之后!

关于MySQL触发器更新当前表的记录报错的解决办法,本文就介绍这么多,希望对大家有所帮助!

03-14 09:02