mysql 触发器详解



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


----------


触发器中afterbefore的区别


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$





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值