导读:本期聚焦于小伙伴创作的《MySQL如何实现库存自动扣减并编写AFTER INSERT触发器同步关联表》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《MySQL如何实现库存自动扣减并编写AFTER INSERT触发器同步关联表》有用,将其分享出去将是对创作者最好的鼓励。

在业务系统中,用户下单后商品库存需要立刻减少,同时要把库存变动记录写入关联表以便后续对账。使用MySQL的AFTER INSERT触发器,可以让数据库在订单写入时自动完成这些操作,避免程序遗漏。

MySQL如何实现库存自动扣减并编写AFTER INSERT触发器同步关联表

一、表结构设计

我们准备三张表:订单表、库存表、库存流水表。订单表插入即触发扣减与记录。

CREATE TABLE `order_tbl` (
  `id` INT PRIMARY KEY AUTO_INCREMENT,
  `product_id` INT NOT NULL,
  `quantity` INT NOT NULL
);

CREATE TABLE `stock_tbl` (
  `product_id` INT PRIMARY KEY,
  `stock_num` INT NOT NULL
);

CREATE TABLE `stock_log` (
  `id` INT PRIMARY KEY AUTO_INCREMENT,
  `product_id` INT NOT NULL,
  `change_num` INT NOT NULL,
  `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP
);

二、编写AFTER INSERT触发器

在order_tbl上创建AFTER INSERT触发器,插入订单后自动减少stock_tbl中的库存,并向stock_log写入一条流出记录。

DELIMITER $$

CREATE TRIGGER `trg_after_order_insert`
AFTER INSERT ON `order_tbl`
FOR EACH ROW
BEGIN
  -- 扣减库存
  UPDATE `stock_tbl`
  SET `stock_num` = `stock_num` - NEW.`quantity`
  WHERE `product_id` = NEW.`product_id`;

  -- 同步写入库存流水关联表
  INSERT INTO `stock_log` (`product_id`, `change_num`)
  VALUES (NEW.`product_id`, -NEW.`quantity`);
END$$

DELIMITER ;

触发器关键点说明

  • AFTER INSERT表示订单提交后再执行,保证主记录已存在。
  • NEW关键字代表刚插入的订单行,可取其product_id与quantity。
  • FOR EACH ROW确保批量插入时每行都触发。

三、使用示例

先写入库存,再插入订单,观察触发器效果。

-- 初始化库存
INSERT INTO `stock_tbl` (`product_id`, `stock_num`) VALUES (1001, 50);

-- 插入订单,触发器自动扣减并记日志
INSERT INTO `order_tbl` (`product_id`, `quantity`) VALUES (1001, 3);

-- 查看结果
SELECT * FROM `stock_tbl` WHERE `product_id` = 1001;
SELECT * FROM `stock_log` WHERE `product_id` = 1001;

四、注意事项

如果库存不足,上述触发器仍会扣成负数。可在触发器内使用条件判断并抛错:

BEGIN
  DECLARE cur_stock INT;
  SELECT `stock_num` INTO cur_stock FROM `stock_tbl` WHERE `product_id` = NEW.`product_id`;
  IF cur_stock < NEW.`quantity` THEN
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '库存不足';
  ELSE
    UPDATE `stock_tbl` SET `stock_num` = `stock_num` - NEW.`quantity` WHERE `product_id` = NEW.`product_id`;
    INSERT INTO `stock_log` (`product_id`, `change_num`) VALUES (NEW.`product_id`, -NEW.`quantity`);
  END IF;
END

通过上述方式,MySQL即可在插入订单时利用AFTER INSERT触发器完成库存自动扣减与关联表同步,提升数据一致性与开发效率。

MySQLAFTER_INSERT触发器库存扣减修改时间:2026-07-31 01:27:18

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。