mysql触发器

本文深入讲解MySQL触发器的创建与应用,包括不同触发条件、时间点及行级触发器的使用,通过具体案例演示如何在商品销售场景下更新库存。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值