DELIMITER //
-- 触发器
-- 需求:
-- 商品表:goods
-- 订单表:ord
-- 当下一个订单时,对应的商品要相应的减少(买几个商品就少几个库存)
-- 分析:
-- 监视谁: ord
-- 监视动作: insert
-- 触发时间: 暂选之后
-- 触发时间: update
CREATE TRIGGER t1
AFTER
INSERT
ON ORD
FOR EACH ROW
BEGIN
UPDATE goods xxxxx;
END
CREATE TABLE goods(
gid INT,
NAME VARCHAR(20),
num SMALLINT
);
CREATE TABLE ORD(
oid INT,
gid INT,
much SMALLINT
);
-- 不引用行变量的触发器
INSERT INTO ORD VALUES (123,1,2);
CREATE TRIGGER t1
AFTER
INSERT
ON ORD
FOR EACH ROW
BEGIN
UPDATE goods SET num = num - 2 WHERE gid = 1;
END
-- 查看已有triggers: show triggers;
-- 删除已有trigger: drop trigger triggerName;
-- 引用行变量的触发器
INSERT INTO ORD VALUES (123,1,2);
CREATE TRIGGER t2
AFTER
INSERT
ON ORD
FOR EACH ROW
BEGIN
UPDATE goods SET num = num - new.much WHERE gid = new.gid;
END//
CREATE TRIGGER t3
AFTER
DELETE
ON ORD
FOR EACH ROW
BEGIN
UPDATE goods SET num = num + old.much WHERE gid = old.gid;
END//
DELETE FROM ORD WHERE oid= ???
-- 修改订单数量(仅限改数量)
CREATE TRIGGER t4
BEFORE
UPDATE
ON ORD
FOR EACH ROW
BEGIN
UPDATE goods SET num = num + old.much - new.much WHERE gid = old.gid;
END//
UPDATE ORD SET much = 20 WHERE oid = 1;//
-- 思考:before与after的区别?
-- 如果剩余3头猪,但客户买了10头猪,发生什么情况?能否预防?
CREATE TRIGGER t5
BEFORE
INSERT
ON ORD
FOR EACH ROW
BEGIN
DECLARE rnum INT;
SELECT num INTO rnum FROM goods WHERE gid = new.gid;
IF new.much > rnum THEN
SET new.much = rnum;
END IF;
UPDATE goods SET num = num - new.much WHERE gid = new.gid;
END//
-- for each row是干嘛的?
-- 在oracle触发器中,触发器分语句级触发器和行级触发器
-- 比如:
CREATE TRIGGER tn
AFTER UPDATE
ON xxtable
FOR EACH ROW
BEGIN
sqlN/
END//
执行:UPDATE xxtable SET xxx=xxx WHERE id>100; #修改了100行
那么sqlN会被触发100次
CREATE TABLE tmp(
id INT
)//
CREATE TRIGGER t6
BEFORE UPDATE
ON ORD
FOR EACH ROW #每一行受影响,触发器都执行,叫做行级触发器
BEGIN
INSERT INTO tmp VALUES (5);
END//
在oracle中,FOR EACH ROW 如果不写,无论UPDATE影响多少行,都只执行1次,
比如:1人下了订单,买了五件商品,INSERT 5次,可以用行级触发器,修改五次库存
用语句级触发,INSERT 一条发货提醒
遗憾的是 mysql 目前还不支持语句级触发器
所听课程为燕十八老师的mysql高级视频教程,视频链接:http://www.php.cn/course/197.html
本文链接:https://blog.youkuaiyun.com/oneeyear/article/details/82982736