触发器:trigger
作用:监视某种情况并触发某种操作
我们可以见识某表的变化,当发生某种变化时,触发某个操作
delimiter $ (指定结束语句;为$)
删除触发器的语法:drop trigger 触发器名
查看触发器:show triggers like '表名';
监视地点:table;
触发时间:after/before
监视事件:insert/updata/delete
触发事件:insert/updata/delete
for each row (行触发器)
触发器监视:增,删,改
触发器触发:增,删,改
----------
创建触发器
create trigger 触发器名
after(之后)/before(之前) (触发时间) insert/update/delete on 表名
for each row (行触发器)
begin
sql语句(一句或多句,insert/update/delete范围内)
例:update g set num = num -3 where id = 2;
end$
如何在触发器中引用行的值
对于insert而言,新增的行用new表示,行中的每一列的值,用new.列名来表示
例子:
create trigger cfq(触发器名)
after insert(要监视的事件) on o(表名)
for each row
begin
update g(商品表) set num = num(商品个数) - new.much(关联商品个数) where id(商品id) = new.gid(关联商品id);
end$
----------
删除订单,库存增加
#监视地点,o表
#监视事件 delete
#触发事件 update
#触发时间 after
new在before触发器中赋值,取值;在after触发器中取值。
new是新插入的数据,old是原来的数据
insert只会有new,代表着要插入的新记录
delete只会有old,代表着要删除的记录
对于delete来说,原本有一行,后来被删除
想引用被删除的这一行,用old来表示,old.列名,就可以引用被删除行中的值
create trigger tg3
after delete(要监视的事件) on o
for each row
begin
update g set num = num + old.much where id = old.gid;
end$
----------
对于update 来说
被修改的行
修改前的数据 用old来表示,old.列名引用修改之前行中的值
修改后的数据 用new来表示,new.列名引用修改之后行中的值
删除订单,库存增加
#监视地点,o表
#监视事件 update
#触发事件 update
#触发时间 after
create trigger tg4
after update(要监视的事件) on o
for each row
begin
update g set num = num + old.much(第一次设定的,旧的商品个数) - new.much(我后来修改的商品个数) where id = old.gid(新/旧的商品id,都一样);
end$
例:
create trigger tg4
after update on o
for each row
begin
update g set num = num + old.much - new.much where id = old.gid;
end$
----------
触发器中after 和 before的区别
after 是先完成数据的增删改再触发
触发中的语句晚于增删改,无法影响前面的增删改动作
before 是先完成触发,再增删改
触发的语句先于增删改发生,我们有机会判断,修改即将发生的操作
典型案例
对于所下订单,进行判断,如果订单的数量 > 5 ,就认为是恶意订单,强制把所订的商品修改成5
#监视地点,o表
#监视事件 insert
#触发事件 update
#触发时间 before
#目的,触发事件先于监视事件发生,并判断监视事件的数据
create trigger tg5
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$
mysql 触发器详解
最新推荐文章于 2024-09-24 15:37:20 发布