触发器: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;