能否使用当前写法的WHERE语句?触发器库存递减需求咨询
关于你触发器WHERE语句的问题分析
你的核心思路是对的——在用户购买后减少对应店铺对应游戏的库存,但当前的WHERE语句存在几个问题,没法正确工作:
- 没有引用刚插入的记录:在触发器中,要获取刚插入到
Purchase表的那条记录的字段值,必须使用NEW关键字(比如NEW.Shop ID),直接写PURCHASE.SHOP_ID的话,数据库不知道你要关联Purchase表中的哪一条记录,会导致逻辑错误。 - 字段名可能不匹配:看你的表结构描述,
Purchase的外键是Shop ID和Game ID,但你代码里写的是PURCHASE.ID_GAME,这明显是字段名写错了;另外IN SHOP表的字段是How many games in shop,你用了HMGIS,如果这不是字段的别名,那也是一个错误。 - 带空格的标识符需要包裹:表名
IN SHOP和字段名How many games in shop、Shop ID都包含空格,直接写会触发语法错误,需要用反引号(`)把这些标识符包裹起来。
修正后的触发器代码
CREATE TRIGGER update_shop_game_stock AFTER INSERT ON Purchase BEGIN UPDATE `IN SHOP` SET `How many games in shop` = `How many games in shop` - 1 WHERE `IN SHOP`.Shop_ID = NEW.`Shop ID` AND `IN SHOP`.Game_ID = NEW.`Game ID`; END;
额外注意事项
- 确保
IN SHOP表中存在对应的Shop_ID和Game_ID组合记录,否则这条UPDATE语句不会有任何效果。如果需要处理“库存记录不存在”的异常场景,可以在触发器里添加判断逻辑(比如用IF EXISTS先检查,或者抛出错误)。 - 触发器命名尽量语义化,比如
update_shop_game_stock,方便后续维护时一眼看出它的作用。
内容的提问来源于stack exchange,提问作者John.Doh
相关产品推荐
相关产品推荐

