MySQL触发器报错1442:无法更新触发语句正在使用的表如何解决?
解决MySQL触发器1442错误的方案
错误原因
你用的是AFTER UPDATE触发器,在触发器内部又执行了UPDATE account_zone语句修改原表数据。MySQL禁止在触发语句(更新account_zone的操作)执行后,再在触发器中对同一张表执行写操作,这会引发循环触发或表锁冲突,从而抛出1442 - Can't update table 'account_zone' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.错误。
修正方案
改用BEFORE UPDATE触发器,直接修改即将写入表的NEW对象的left_coin值,无需执行额外的UPDATE语句。BEFORE触发器在数据提交到表前生效,直接修改新值即可完成需求,不会触发对原表的二次更新操作。
修正后的触发器代码
DELIMITER // CREATE TRIGGER update_left_coin BEFORE UPDATE ON account_zone FOR EACH ROW BEGIN -- 仅当extpoint2字段值发生变化时执行更新 IF !(NEW.extpoint2 <=> OLD.extpoint2) THEN SET NEW.left_coin = NEW.left_coin + (NEW.extpoint2 - OLD.extpoint2); END IF; END;// DELIMITER ;
代码说明
BEFORE UPDATE:确保在数据更新到表之前修改left_coin的新值!(NEW.extpoint2 <=> OLD.extpoint2):判断extpoint2字段是否发生变化(<=>可处理NULL值的相等判断)SET NEW.left_coin = ...:直接修改即将写入表的left_coin值,替代原有的UPDATE语句,避免触发表更新冲突
内容的提问来源于stack exchange,提问作者zhinxao
相关产品推荐
相关产品推荐

