MySQL 触发器

触发器:trigger(枪击,扳机,引线)
一触即发

作用:监视某种情况并触发某种操作
比如:监视某表的变化,当发生某种变化时,触发某个操作
可以监视的操作:增删改
可以触发的操作:增删改
触发器创建语法之四要素
监视地点:table
监视事件:insert/update/delete
触发时间:after/before
触发事件:insert/update/delete
创建触发器的语法
create trigger 触发器名
after/before
insert/update/delete
on 表名
for each row #这句话是固定的
begin
 sql语句#(一句或多句)
end;

这个时候因为sql语句中含有多个   ;  所以我们需要改变sql语句的结束符

用delimiter将结束符改成&
delimiter $ (执行了这条语句后,后面的结束符就不再是  ; 而是  $ )

删除触发器:

drop trigger 触发器名;

小练习:

建两张表
商品表
create table g(
id int,
name varchar(10),
num int
)charset utf8;

订单表
create table o(
oid int,
gid int,
much int
)charset utf8;

添加商品
insert into g
values
(1,"猪",22),
(2,"羊",19),
(3,"狗",12),
(4,"猫",8);

购买商品
insert into o
values 
(1,2,3);

更新商品表
update g
set num=num-3
where
id=2;

利用触发器实现:
1.监视地点:o表
2.监视事件:inert
3.触发时间:after
4.触发操作:update

new 在触发器中,表示新添加的一行。用new.列(new点列)的方式可以引用新添加的一行的每列的数据
#添加一个订单,商品表减少相应的数量
create trigger tg1
after 
insert 
on o	
for each row
begin
update g set num=num-new.much where id=new.gid;
end$

下面的情况和用old代替上面的new
#删除一个订单,商品表增加相应的数量
create trigger tg2
after
delete
on o
for each row
begin
update g set num = num + old.much where id = old.gid;
end;$

delete from o where gid=1;

因此,
在触发器中引用行的值:
对于insert而言,新增的行,用new来表示
行中的每一列的值,用 new.列 来表示
对于delete而言,删除的行,用old来表示
向引用被删除的行的值,用 old.列 来表示
updte同上;

触发器after和before的区别

after 是先完成数据的增删改,在触发
触发的语句晚于监视的增删改,无法影响前面的增三该动作

before 是先完成触发,在增删改
触发的语句先于监视的增删改发生,我么有机会判断,修改即将发生的操作

自己实现:
对于所下订单,进行判断,如果订单的数据>5,就认为是恶意订单
强制把所有订的商品数量改成5.

#在这之前把前面一个触发器给删除,否则会触发两次
drop trigger tg1;$

create trigger tg3
before
insert on o
for each row
begin
if new.much>5 then set new.much=5;
end if;
update g set num=num-new.much where id=new.gid;
end;$
查看触发器
show triggers;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值