MySQL触发器更新当前表的记录报错的解决


关键词

MySQL 触发器 更新 当前记录 报错

摘要

本文介绍在MySQL触发器中操作当前表时报错的解决办法。触发器绑定的当前表,在触发器中也是可以操作更新的。

首页,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触发器更新当前表的记录报错的解决办法,本文就介绍这么多,希望对大家有所帮助!



 

要饭二维码

洪哥写文章很苦逼,如果本文对您略有帮助,可以扫描下方二维码支持洪哥!金额随意,先行谢过!大家的支持是我前进的动力!

文章的版权


如果您在服务器运维、网络管理、网站或系统开发过程有需要提供收费服务,请加QQ:8771947!十年运维经验,帮您省钱、让您放心!
亲,如果有需要,先存起来,方便以后再看啊!加入收藏夹的话,按Ctrl+D

« MySQL中字符串类型的字段最大使用longtext来存储 MySQL触发器搞定文章审核统计 »