Mysql之触发器trigger

mysql之触发器trigger


触发器(trigger):监视某种情况,并触发某种操作。
触发器创建语法四要素:
1.监视地点(table) 
2.触发时间(after/before) 
3.监视事件(insert/update/delete)
4.触发事件(insert/update/delete)


语法:
Note:
==
需要先执行该语句:
delimiter $ [意思是告诉mysql语句的结尾换成以$结束]
==
1、触发器创建语法
create trigger [trigger_Name]
after/before [触发时间]
insert/update/delete [监视事件] 
on 表名 [监视地点]
for each row   [mysql固定语句]
begin
declare var_name var_type [default value];
//
select 列名 into var_name from table_name where [条件]
//
这里就可以使用var_name变量做其他的操作
//
sql语句;
//
end$


2、【insert】,新插入的行用new来表示,行中的每一列的值用[new.列名]来表示。
    第二个触发器创建之前需先将第一个触发器删掉
drop trigger [trigger_Name]$
         
create trigger [trigger_Name]
after [触发时间]
insert [监视事件]
on 表名 [监视地点]
for each row [mysql固定语句]
begin
update table_name set 列=列[+、-、*、/等操作符]new.列 where id=new.id;
end$
3、【delete】,想引用被删除的这一行用old来表示,删除行的值可用[old.列名]来表示


create trigger [trigger_Name]
after [触发时间]
delete [监视事件]
on 表名 [监视地点]
for each row [mysql固定语句]
begin
update table_name set 列=列[+、-、*、/等操作符]old.列 where id=old.id;
end$
4、【update】,修改行的数据修改之前的数据用old表示,修改之后的数据用new表示,
    通过[old.列名]获得修改之前的数据,通过[new.列名]来获得修改之后的数据


create trigger [trigger_Name]
after [触发时间]
update [监视事件]
on 表名 [监视地点]
for each row [mysql固定语句]
begin
[先把旧的数量恢复再减去新的数量就是修改后的数量了]
update table_name set 列=列+old.列-new.列 where id=[old/new].id;
end$


【备注】:
1、[table_name]是在被监视的[表名]这个表发生增删改的时候所触发的修改表。
即[表名]这个表发生变化之后[table_name]这个表也做出相应的数据变动。比如订单插入
成功之后要随即更改库存中商品的数量
2、[for each row]的作用?
  在oracle触发器中,触发器分为语句级和行级触发器
oracle中DML触发器的主要语法
1 create [or replace] trigger [schema.] triggerName
2 {before|after|instead of}
3 {delete|insert|update[of colum[,colum]...]}
4 [or {delete|insert|update[of colum[,colum]...]}]...
5 {on [schema.]table|[schema.]view}
6 [for each row]
7 [follows[schema.]trigger[,[schema.]trigger]...]
8 [enable|disable]
9 [when (condition)]
10 trigger_body


【说明】
第一行中:or replace:新建的触发器可以覆盖同名的触发器,trigger:关键字,schema:触发器
所属的模式(可以简单的看成用户名),如果不加该项则表示该触发器属于自己
第二行中:before,after:标明触发器是前触发还是后触发,instead of :为替代类型
第三行中:delete|insert|update:为触发的事件,[of colum[,colum]:触发条件具体到某列
第四行中:表示可以追加多个条件
第五行中:触发器作用的表或视图,instead of 类型可以作用在视图上
第六行中:表示行级触发器,省略则为语句级触发器


PS:行级和语句级的区别
行触发器和语句触发器的区别表现在:行触发器要求当一个DML语句操作影响数据库中的多行数据时,
对于其中的每个数据行,只要它们符合触发约束条件,均激活一次触发器;而语句触发器将整个语句操作作为触发事件,
当它符合约束条件时激活一次触发器。当省略FOR EACH ROW 选项时,BEFORE 和AFTER 触发器为语句触发器,
而INSTEAD OF 触发器则只能为行触发器。
        举个例子:
1人下订单买了5件商品insert 5次,可以用行级触发器修改5次数据库,也可以
使用语句级触发器insert一条发货提醒


第七行中:触发器执行的顺序
第八行中:设置触发器是否可用
第九行中:触发该触发器的条件
第十行中:触发器的函数体
因此:
for each row 为行级触发器也就是每一行受影响触发器就执行一次。
同时Mysql不支持语句级的触发器。
5、【before和after的区别】
after是先完成数据的增删改再触发,触发的语句晚于监视的增删改操作,
无法影响前面的增删改动作,也就是说先插入订单记录再更新商品的数量;


before是先完成触发再增删改,触发的语句先于监视的增删改,
我们就有机会判断修改即将发生的操作;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值