mysql数据库 触发器
来源:互联网 发布:猎豹wifi mac 编辑:程序博客网 时间:2024/05/02 02:26
触发器:
我们可以监视某表的变化,当发生某种变化时,触发某个操作
能监视:增,删,改
触发操作:增,删,改
触发器应用场景:
1.当向一张表中添加或删除记录时,需要在相关表中进行同步操作。
比如,当一个订单产生时,订单所购的商品的库存量相应减少。
2.当表上某列数据的值与其他表中的数据有联系时。
比如,当某客户进行欠款消费,
可以在生成订单时通过设计触发器判断该客户的累计欠款是否超出了最大限度。
3.当需要对某张表进行跟踪时。
比如,当有新订单产生时,需要及时通知相关人员进行处理,
此时可以在订单表上设计添加触发器加以实现
案例如下:
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:
可见触发器已经起作用
例二、
监视事件: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:
我们可以监视某表的变化,当发生某种变化时,触发某个操作
能监视:增,删,改
触发操作:增,删,改
触发器应用场景:
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:
可见触发器已经起作用
例二、
删除一个订单,库存相应增加
监视事件: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 $ 这个语句结束不能加;否则认为是$;结束
- mysql数据库 触发器
- mysql数据库触发器详解
- mysql数据库 触发器
- MySQL数据库 触发器
- MySQL数据库触发器
- MySQL数据库触发器(trigger)
- MySQL数据库之触发器
- 【数据库】MySQL触发器
- mysql数据库触发器(六)
- Mysql数据库中的触发器
- mysql数据库触发器详解
- mysql数据库触发器的操作
- MySQL数据库的触发器操作
- Mysql数据库中的触发器操作
- 如何用触发器管理MySQL数据库
- 妙用触发器有效管理MySQL数据库
- MySQL数据库中触发器应用深入研究
- 如何用触发器管理MySQL数据库
- 6个常见的 PHP 安全性攻击
- 该死的“代码就是文档”
- Myeclipse 编辑jsp导致运行速度慢的问题解决方法
- java中equals和==的区别
- 页面中的js执行顺序
- mysql数据库 触发器
- iframe的一个案例
- 网页中嵌入Flash的方法
- Eclipse 默认打开Android xml 布局视图的问题
- 关于 USB调试/未知源 的打开 权限问题
- 9个最常见IE的Bug及其fix
- 最强A9四核加成?魅族“梦想”机MX四核版评测
- 软件开发过程种常见英语
- [ios]iPhone应用程序编程指南--窗口和视图