在业务系统中,用户下单后商品库存需要立刻减少,同时要把库存变动记录写入关联表以便后续对账。使用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