You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL中使用触发器实现现有列数值减法运算的方案咨询

MySQL触发器实现库存自动扣减方案

前提说明

以下实现以更新product表的PROD_QOH字段扣减产品库存时,自动扣减part表零件库存为常见业务场景编写,你可以根据实际业务的触发时机、表关联规则自行调整逻辑。

原始表结构及初始化数据

create table product
(PROD_CODE varchar(100),
PROD_QOH int);

insert into product 
values("ABC", 1250);

create table part
(PART_CODE varchar(100),
PROD_QOH int);

insert into part
values("A", 567),
("B", 98),
('C', 549);

触发器编写示例

实现逻辑:当product表的PROD_QOH字段更新后的值小于旧值(即发生库存扣减)时,自动计算扣减差值,校验part表库存充足后执行批量扣减,库存不足时直接终止操作抛出错误。

DELIMITER //
CREATE TRIGGER trg_product_deduct_part_stock
AFTER UPDATE ON product
FOR EACH ROW
BEGIN
    -- 仅产品库存发生扣减时触发后续逻辑
    IF NEW.PROD_QOH < OLD.PROD_QOH THEN
        -- 计算需要扣减的库存数值
        SET @deduct_value = OLD.PROD_QOH - NEW.PROD_QOH;
        -- 校验所有零件库存是否足够扣减,避免出现负数
        IF EXISTS (SELECT 1 FROM part WHERE PROD_QOH < @deduct_value) THEN
            SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '零件库存不足,无法完成扣减操作';
        END IF;
        -- 执行part表库存扣减,如有product和part的关联规则,可在此处增加WHERE条件筛选对应零件
        UPDATE part SET PROD_QOH = PROD_QOH - @deduct_value;
    END IF;
END //
DELIMITER ;

效果测试

执行以下语句扣减product库存10单位:

UPDATE product SET PROD_QOH = PROD_QOH - 10 WHERE PROD_CODE = 'ABC';

执行后查询part表,三个零件的PROD_QOH会分别更新为557、88、539;如果扣减数值超过任意零件的现有库存,操作会直接终止并抛出错误提示。

逻辑调整说明

  • 如果product和part存在对应绑定关系,只需在UPDATE part的语句中增加WHERE条件筛选关联零件即可,不需要全表扣减
  • 如果触发场景为插入/删除操作,只需将触发器的AFTER UPDATE改为AFTER INSERT/AFTER DELETE,调整扣减数值的取值逻辑即可

内容的提问来源于stack exchange,提问作者Alfonzo Kgakole

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 09:54:05