MySQL--触发器

触发器trigger

1、什么是触发器
触发器(trigger):监视某种情况,并触发某种操作,它的执行是由事件来触发的,例如当对一个表进行操作( insert,delete, update)时就会激活它执行。

触发器经常用于加强数据的完整性约束和业务规则等。 触发器创建语法四要素:
1.监视地点(table)
2.监视事件(insert/update/delete)
3.触发时间(after/before)
4.触发事件(insert/update/delete)

2、触发器基本语法
创建触发器:
Create trigger trigger_name trigger_time trigger_event on tb_name for each row trigger_stmt;

trigger_time :触发器的触发事件,可以为before(在检查约束前触发)
或after(在检查约束后触发);

trigger_event:是触发器的触发事件,包括insert、update和delete;

tb_name: 表示建立触发器的表名,就是在哪张表上建立触发器

trigger_stmt: 触发器的程序体,可以是一条SQL语句或者是用BEGIN和END包含的多条语句;

FOR EACH ROW:表示任何一条记录上的操作满足触发事件都会触发该触发器。

删除触发器:
Drop trigger 触发器名称。

案例:
有两张表格分别为 商品表 和订单表
– 创建商品表
create table g(
id int primary key auto_increment,
name varchar(20),
num int
);
– 创建订单表
create table o(
oid int primary key auto_increment,
gid int,
much int
);
– 插入商品
insert into g(name,num) values(‘苹果’,10),(‘香蕉’,10),(‘桔子’,10);

练习1: 卖了3个苹果,请更新商品表和订单表中的数据。
– 1.往订单表插入一条记录
– insert into o(gid,much) values(1,3);
– 2.更新商品表商品1的剩余数量
– update g set num=num-3 where id=1;

练习2:使用触发器来完成练习1的效果。
– 创建触发器
– 修改结束符
delimiter $

create TRIGGER tg1 after insert on o for each row
begin
update g set num = num-3 where id = 1;
end $

delimiter ;

insert into o(gid,much) VALUES(1,3);

注: 会发现苹果的数量变为7了,说明在我们插入一条订单的时候,触发器自动帮我们做了更新操作。

产生的问题:
不管我们买哪个商品,最终更新的都是商品1的数量。
insert INTO o(gid,much) VALUES(2,2);

练习3:创建对任意商品改变的触发器
扩展:
new 和old 的使用:
在这里插入图片描述
NEW.columnname:新增行的某列数据
OLD.columnname:删除行的某列数据

代码:
delimiter $
create trigger tg2 after insert on o for each row
BEGIN
update g set num = num-new.much where id = new.gid;
END $

delimiter ;

INSERT into o(gid,much) values(2,3);

drop trigger tg2;

练习4:当用户撤销一个订单的时候,直接删除一个订单,对应的商品数量再加回去

delimiter $
CREATE TRIGGER tg3 after delete on o for each ROW
BEGIN

UPDATE g set num=num+old.much where id = old.gid;

END $

delimiter ;

drop TRIGGER tg3;

DELETE from o where oid = 3;

练习5:当新增一条订单记录时,判断订单的商品数量,如果数量大于了库存数量,就默认改为库存数量。(有可能订单的数据大于库存数据因此会有问题)

扩展: before 和after 的区别:
after是先完成数据的增删改,再触发,触发的语句晚于监视的增删改操作,无法影响前面的增删改动作;也就是说先插入订单记录,再更新商品的数量;
before是先完成触发,再增删改,触发的语句先于监视的增删改,我们就有机会判断,修改即将发生的操作;
Delimiter $
create trigger tg6

before insert on o

for each row

begin

if new.much > 10 then

set new.much = 10;

end if;

update g set num = num - new.much where id = new.gid;

end$

Delimiter $

insert into o(gid,much) valus(1,20);

执行完会发现订单记录的数量变为10,商品1的数量变为0了,就不会出现负数了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值