触发器中的BEFORE和AFTER区别

本文深入探讨了SQL触发器的应用,通过实例展示了BEFORE和AFTER触发器如何在DML操作前后执行,包括限制订单数量、更新库存及退货流程。通过具体代码演示了触发器在数据一致性维护中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      触发器中的BEFORE和AFTER用于标识触发时间,before代表触发器命令在DML修改数据之前执行,after代表触发器命令在DML修改数据之后执行。

1、before:如果订货物数量大于五,则将订货数量设为五(订货数不能超过5)

DELIMITER $$

USE `cm2`$$

DROP TRIGGER /*!50032 IF EXISTS */ `t3`$$

CREATE
    /*!50017 DEFINER = 'root'@'localhost' */
    TRIGGER `t3` BEFORE INSERT ON `it_order` 
    FOR EACH ROW BEGIN
IF new.good_much>5
THEN
SET new.good_much=5  ;
END IF;
    END;
$$

DELIMITER ;

于是我们进行操作

INSERT INTO it_order VALUES(2,2,11);
SELECT * FROM it_order;

在这里插入图片描述
此效果是在插入之前,触发器进行的修改。

2、after:实现订货库存的退货和出货更新
退货更新(如果订单删除则库存加回原样)

DELIMITER $$

USE `cm2`$$

DROP TRIGGER /*!50032 IF EXISTS */ `t1`$$

CREATE
    /*!50017 DEFINER = 'root'@'localhost' */
    TRIGGER `t1` AFTER DELETE ON `it_order` 
    FOR EACH ROW BEGIN
      UPDATE it_goods SET goods_number=goods_number+old.good_much WHERE id= old.goods_id;
    END;
$$

DELIMITER ;

DELIMITER $$

订单更新

USE `cm2`$$

DROP TRIGGER /*!50032 IF EXISTS */ `t2`$$

CREATE
    /*!50017 DEFINER = 'root'@'localhost' */
    TRIGGER `t2` AFTER UPDATE ON `it_order` 
    FOR EACH ROW BEGIN
UPDATE it_goods SET goods_number=goods_number+old.good_much WHERE id=old.goods_id;
UPDATE it_goods SET goods_number=goods_number-new.good_much WHERE id=new.goods_id;
    END;
$$

DELIMITER ;

结合前面的触发器和数据库我执行代码

    INSERT INTO it_order VALUES(1,2,1);
    INSERT INTO it_order VALUES(2,3,5);
    UPDATE it_order  SET goods_id=3,good_much=4 WHERE order_id=1;

   SELECT * FROM it_goods;
   SELECT * FROM it_order;

订单如图
在这里插入图片描述
订单跟新后
在这里插入图片描述

仓库数据更新

SELECT * FROM it_goods;

在这里插入图片描述
触发器可能有些不完善,如货舱数量不能为负,订单不能超出货舱数量上限,这些都可以由触发器完成,大家可以使用触发器完善。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值