如何实现MySQL After Update Trigger插入循环?多表关联场景
解决MySQL触发器批量插入配方原料的问题
嘿,我来帮你搞定这个需求!要实现当batches表更新时,根据base_formula里的多行配方记录批量插入到raw_materials_stock,其实不用写繁琐的循环——MySQL的INSERT ... SELECT语法就能完美解决这个问题,比游标高效多了。
完整触发器代码
DELIMITER // CREATE TRIGGER after_batches_update AFTER UPDATE ON batches FOR EACH ROW BEGIN -- 只在批次标记为完成时触发(也就是complete_dt从空值被设置为具体日期的时候) IF NEW.complete_dt IS NOT NULL AND OLD.complete_dt IS NULL THEN -- 批量插入原料库存记录 INSERT INTO raw_materials_stock (batch_id, raw_material_id, use_date, quantity) SELECT NEW.batch_id, bf.raw_material_id, NEW.complete_dt, -- 这里假设batches表有batch_quantity字段表示批次总产量,计算实际用量 -- 如果你的batches没有这个字段,直接替换成符合你业务的计算逻辑就行 NEW.batch_quantity * bf.percentage / 100 AS quantity FROM base_formula bf WHERE bf.base_id = NEW.base_id; END IF; END // DELIMITER ;
关键细节解释
- 触发时机控制:加了
IF判断是为了避免每次更新batches都执行插入——只有当批次从“未完成”(complete_dt为空)变为“完成”(设置了具体日期)时才触发,防止重复插入数据。 - 批量处理多行配方:
INSERT ... SELECT直接把base_formula中对应当前批次base_id的所有原料记录一次性插入到raw_materials_stock,省去了写游标循环的麻烦,性能也更好。 - 用量计算逻辑:示例里假设
batches有batch_quantity字段(比如批次的总产量),用量按“总产量×配方百分比÷100”计算。如果你的业务里用量的计算方式不一样,直接修改quantity那行的表达式就好——比如如果percentage本身就是实际用量,直接写bf.percentage就行。
几个要注意的点
- 如果你的
batches表确实没有批次总量字段,要么补充这个字段,要么根据实际业务调整quantity的取值,不然没法算出合理的原料用量。 - 要确保
base_formula里的base_id和raw_material_id的关联是正确的,不然会插错原料。 - 触发器会跟着更新操作在同一个事务里执行,如果插入失败,整个批次更新也会回滚,保证数据不会乱。
内容的提问来源于stack exchange,提问作者Robert Low
相关产品推荐
相关产品推荐

