文档章节

mysql数据库触发器

wayhk
 wayhk
发布于 2015/05/13 14:22
字数 1190
阅读 9
收藏 1

触发器:
我们可以监视某表的变化,当发生某种变化时,触发某个操作
能监视:增,删,改
触发操作:增,删,改


触发器应用场景:
1.当向一张表中添加或删除记录时,需要在相关表中进行同步操作。
比如,当一个订单产生时,订单所购的商品的库存量相应减少。

2.当表上某列数据的值与其他表中的数据有联系时。
比如,当某客户进行欠款消费,
可以在生成订单时通过设计触发器判断该客户的累计欠款是否超出了最大限度。

3.当需要对某张表进行跟踪时。
比如,当有新订单产生时,需要及时通知相关人员进行处理,
此时可以在订单表上设计添加触发器加以实现



案例如下:

例一、

增加一个订单  库存相对减少  使用触发器解决问题

create table g(
id int,
name varchar(10),
num int
)charset utf8;

create table o(
oid int,
gid int,
much int
)charset utf8;


insert into g
values 
(1,'猪',22),
(2,'羊',19),
(3,'狗',12),
(4,'猫',8);


g表查询结果如图1:


通过触发器:
监视地点:o表
监视操作:insert
触发操作:update
触发时间:after

创建触发器的语法:
create trigger triggerName 
after/before insert/update/delete on表名
for each row  #这句话是固定的
begin
sql语句    # 一句或多句,insert/update/delete范围内
end;


delimiter $  告诉服务器以什么符号结束  默认是一“;”结束 这里是以“$”结束

create trigger tg1
after insert on o
for each row
begin
update g set num = num - 3 where id = 2;
 #这里必须用“;”但是mysql遇见;结束  所以说要修改结束符
end$  
告诉触发器以什么符号结束 这里是$结束
这个触发器不够完美 修改有局限性

然后操作触发器 insert into o values (2,2,3)$
此时g表查询结果如图2:


删除触发器的语法:
drop trigger 触发器名;(drop trigger tg1;)

如何在触发器引用行的值
对于insert而言,新增的行 用new来表示
行中的每一列的值,用 new.列名 表示


create trigger tg2
after insert on o
for each row 
begin 
update g set num = num - new.much where id = new.gid;
end$


没有操作之前的g表信息如图3:

操作触发器
insert into o values (1,4,2);
此时如图4:

可见触发器已经起作用  

例二、

删除一个订单,库存相应增加


监视地点:o表
监视事件:delete
触发事件:update
触发时间:after


对于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$

没有触发之前
g表信息如图5:

o表信息如图6:


操作触发器:
delete from o where oid = 1$
此时g表信息如图7:


例三、
修改订单的数量,改变库存的触发器
对于update来说
被修改的行,
修改前的数据,用old来表示,old.列名 引用被修改之前行中的值
修改后的数据,用new来表示,new.列名 引用被修改之后行中的值


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$


修改前g表的数据如图8:


o表的数据如图9:


操作触发器后:

update o set much = 7 where oid = 1;

g表的数据如图10:

o表的数据如图11:



触发器里after和before的区别
after是先安完成数据的增,删,改再触发
触发的语句晚于监视的增,删,改,无法影响前面的增删改动作

before是先完成触发,再增删改
触发的语句先于监视的增删改发生,我们有机会判断,修改即将发生的操作



典型案例
对于所下订单,进行判断,如果订单的数量>5,就认为是恶意订单,
强制把所订的商品数量改成5

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$

查看g表的所有数据 如图1:


查看o表的所有数据 如图2:


触发触发器:
insert into o values (1,1,100)$
此时查看g表的所有数据 如图3:


查看o表的所有数据 如图4:


此时可以看出用before可以判断


查看所有的触发器
show triggers;

特别注意:使用触发器要修改结束符“;”一般修改成“$”

delimiter $  这个语句结束不能加;否则认为是$;结束


本文转载自:http://blog.csdn.net/huangjianxiang1875/article/details/7885130

共有 人打赏支持
wayhk
粉丝 1
博文 36
码字总数 17367
作品 0
海淀
程序员
自动生成mysql触发器代码,实现数据同步

自动生成mysql触发器代码,实现数据同步 如果公司里有上百个表要做触发器,如果手动写代码的话。很累,所以今天写了一个小程序,自动生成mysql的触发代码。 $dbname = 'test';//数据库 $tab1 ...

刘赤龙
2010/06/08
0
0
mysql-之触发器_已迁移

mysql 触发器 当发生某个事件(增删更查)时可以执行定义的sql语句 ===============总结 无情的分隔线 总结======================== 一、触发器作用 MySQL包含对触发器的支持。触发器是一种与...

鬼谷子灬
2016/06/29
14
0
mysql存储过程入门与提高(第一篇)

以前在网上看到歪国人专门写了本mysql存储过程,感觉很强大啊。 MySQL stored programs包括存储过程,函数,触发器。 主要有三种类型的数据库存储程序 存储过程 存储过程是最常见的存储程序,...

落叶刀
2015/09/23
132
0
MySQL的触发器

触发器—trigeer是数据库下用于监视数据改变的某种情况,并触发执行某种操作的一个功能,简单来说就是对某一张表符合某种条件的更改前或者后执行一段存储过程。在这里就简单的说一说在MySQL...

往事_Jim_遗
01/08
0
0
一次mysql 用户不存在的报错

前阵回收生产帐号的访问范围,即之前是xxx@"%"的帐号命名方式,修改成若干个以前端应用部署的机器IP为准,修改成xxx@"IP address"。尽量减少不可信客户端连接数据库的情况发生,加强数据安全...

Jenkin_lin
2017/03/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

一个可能的NEO链上安全随机数解决方案

0x00 困境 链上安全随机数生成应该算是一个比较蛋疼的问题,哪怕你的系统再牛逼,合约程序困在小小的虚拟机里,哪怕天大的本事也施展不开。 更悲催的是,交易执行的时候,是在每一个节点都执...

暖冰
今天
1
0
【大福利】极客时间专栏返现二维码大汇总

我已经购买了如下专栏,大家通过我的二维码你可以获得一定额度的返现! 然后,再给大家来个福利,只要你通过我的二维码购买,并且关注了【飞鱼说编程】公众号,可以加我微信或者私聊我,我再...

飞鱼说编程
今天
4
0
Spring5对比Spring3.2源码之容器的基本实现

最近看了《Spring源码深度解析》,该书是基于Spring3.2版本的,其中关于第二章容器的基本实现部分,目前spring5的实现方式已有较大改变。 Spring3.2的实现: public void testSimpleLoad(){...

Ilike_Java
今天
1
0
【王阳明心学语录】-001

1.“破山中贼易,破心中贼难。” 2.“夫万事万物之理不外于吾心。” 3.“心即理也。”“心外无理,心外无物,心外无事。” 4.“人心之得其正者即道心;道心之失其正者即人心。” 5.“无...

卯金刀GG
今天
2
0
OSChina 周三乱弹 —— 我们无法成为野兽

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ _刚刚好: 霸王洗发水这波很骚 手机党少年们想听歌,请使劲儿戳(这里) hahahahahahh @嘻酱:居然忘了喝水。 让你喝可乐的话, 你准忘不了...

小小编辑
今天
21
4

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部