触发器中的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;
触发器可能有些不完善,如货舱数量不能为负,订单不能超出货舱数量上限,这些都可以由触发器完成,大家可以使用触发器完善。