触发器 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语句中可以使用new和old两个关键字,分别代表新行数据和旧行数据,行中的数据用关键字.列名来表示。
对于新增行(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$