触发器 trigger

监视某张表的变化,触发某种操作

可监视的数据库操作种类:增删改

应用场景:如订单管理,添加订单后,原表库存减少



触发器四要素:

监视地点:on 表

监视事件:insert/delete/update

触发时间:after/before

触发事件:sql (insert/delete/update)



创建触发器语法:

delimiter $              注意:$为你定义的任意符号,后面不要加;

create trigger 触发器名字

after/before  (update/insert/delete) on 表名

for each row

begin 

sql 语句 (1条或多条)

end$

注意:sql 语句是以分号(;) 结果,触发器也是以分号(;)结尾,这样或冲突,所以我们要重新定义结束符  delimiter $ 并把触发器以$结尾



删除触发器语法

drop trigger 触发器名字;



查看已有的触发器

语法:show triggers;



查看已有触发器的创建语句

语法:show create trigger 触发器名;



触发事件 sql语句中的new .old

SQL语句:可以是多条语句,如果需要使用多条语句的话应该先修改语句结束符。SQL语句中可以使用newold两个关键字,分别代表新行数据和旧行数据,行中的数据用关键字.列名来表示。

对于新增行(insert) 而言,新行用 new

新行的每一列,用new.列名

delimiter $                             -- 创建mysql结束符
create trigger jk after insert on o     -- 创建触发器 jk ,在 o 表新增数据时监控
for each row                              
begin
update g set g.num = g.num -  new.much where g.id = new.gid;  -- sql 执行触发事件 更新g表数据
end$

对于触发事件表中删除(delete)的数据,

如果要引用删除行的数据,可以用 old 来表示,old.列名,就可以引用被删除的列

对于update

被修改的行,修改前的数据用old ,修改后的数据用 new



触发器里 before 和 after 的区别

after : 先完成增删改操作,然后完成触发器触发事件 ,无法对前面增删改进行影响

before:先完成触发器触发事件,在执行增删改 ,我们有机会进行判断增删改操作是否合理

before 应用场景:对于所下订单进行判断,如果订单大于50,就视为恶意订单,强制修改订单数量为5

delimiter $
create trigger tg4
before insert  on o
for each row
begin
if new.much > 5 then
   set new.much = 5;
end if;
update g set g.num = g.num + new.much where g.id = new.gid;
end$