MySQL创建AFTER INSERT触发器更新同表报错该如何解决?
问题原因
该报错是MySQL的内置限制:AFTER INSERT触发器触发时,当前插入操作还未完成对表的锁定释放,不允许在触发器内再次对同一张表执行UPDATE/DELETE等写入操作,避免出现死锁、递归触发等异常。同时你编写的触发器逻辑还有两个问题:
- 没有限定只修改当前新插入的行,直接执行UPDATE会修改表中所有符合条件的历史行,不符合需求
- 条件中的
/dev/map/4-4末尾多了多余空格,会匹配不到正确的path值
解决方案
把触发器类型从AFTER INSERT改成BEFORE INSERT,不需要执行UPDATE语句,直接修改待写入的NEW对象的字段值即可,正确代码如下:
DELIMITER $$ CREATE TRIGGER UpdateState BEFORE INSERT ON report FOR EACH ROW BEGIN -- 只校验当前新插入的行是否符合修改条件 IF NEW.ip_element = '10.66.16.55' AND NEW.path = '/dev/map/4-4' AND NEW.state = 'failed' THEN SET NEW.state = 'ok'; END IF; END $$ DELIMITER ;
逻辑说明
BEFORE INSERT触发器在数据真正写入表之前触发,直接修改NEW对象的字段值,修改后的值会随本次插入一起写入表,不需要额外执行UPDATE操作,完全规避同表写入冲突- 新增的IF条件仅校验当前新插入的行,不会影响表中已有的历史数据
- 去掉了path值末尾的多余空格,匹配逻辑更准确
内容的提问来源于stack exchange,提问作者user14867757
相关产品推荐
相关产品推荐

