MySQL触发器中同时执行SELECT与UPDATE操作语法报错求助
触发器创建失败问题排查与修复方案
核心问题原因
- 未临时修改SQL语句分隔符:MySQL默认以
;作为语句结束标记,触发器BEGIN...END块内部使用了;,会导致创建语句被提前截断,触发语法错误。 - 逻辑冗余且存在并发隐患:行级触发器无需主动查询Trans表的最新插入记录,直接通过
NEW关键字即可获取当前触发触发器的新插入行数据,原有写法在多并发插入场景下会出现库存扣减错误。 - 冗余查询:无需单独查询Parts表的Part_ID,可直接在更新语句中通过PartNo关联匹配。
修复后触发器代码
-- 临时修改分隔符为// DELIMITER // CREATE TRIGGER Quantity AFTER INSERT ON Trans FOR EACH ROW BEGIN -- 直接用NEW关键字取当前插入的产品和数量,更新对应零件库存 UPDATE Parts SET Qty_OnHand = Qty_OnHand - NEW.Qty WHERE PartNo = NEW.Product; END // -- 改回默认分隔符 DELIMITER ;
补充说明
如果需要处理PartNo不存在的异常场景,可在更新语句前增加判断逻辑,避免无匹配记录时无提示运行。
内容的提问来源于stack exchange,提问作者Mike Crawford
相关产品推荐
相关产品推荐

