MySQL触发器报错:无法更新item表,求插入交易明细时的解决方法
问题解决:触发器更新item表报错的原因与修复方案
错误原因分析
你遇到的报错是两个问题叠加导致的:
- 触发器冗余关联表:你写的触发器里,
UPDATE item时多余关联了detail_transaction表,这不仅没必要,还会引发额外的表锁竞争。 - 插入语句与触发器的表访问冲突:插入语句的
VALUES子句里嵌套了对item表的查询,此时item表处于被触发语句(INSERT)占用的状态,触发器再尝试更新该表,就会触发MySQL的锁机制限制——它不允许触发语句和触发器同时操作同一张表,以此避免死锁或数据不一致。
修复步骤
1. 修正触发器逻辑
完全不需要关联detail_transaction表,直接利用触发器的NEW对象获取刚插入的id_item和count,更新对应item的库存即可:
DELIMITER $$ CREATE TRIGGER update_stock AFTER INSERT ON detail_transaction FOR EACH ROW BEGIN UPDATE item SET stock = stock - NEW.count WHERE item.id = NEW.id_item; END$$ DELIMITER ;
2. 优化插入语句
避免在VALUES子句中嵌套查询item表,改用INSERT ... SELECT的方式完成插入,绕过表访问冲突:
INSERT INTO detail_transaction (id, id_item, count, total_price) SELECT 2, 1, 10, price * 10 FROM item WHERE id = 1;
如果需要插入多条数据,也可以先查询出价格计算好total_price后再执行插入,核心都是避免在触发语句的VALUES里直接访问item表。
验证效果
执行修正后的插入语句后,item表中id=1的stock会从900变为890,完全符合你的需求。
内容的提问来源于stack exchange,提问作者user171122
相关产品推荐
相关产品推荐

