Mysql触发器(上篇)
触发器是什么?
答:触发器是一种特殊的事务。
触发器的应用场合:
1、当向一张表中添加或删除或更新记录时,需要在相关表中进行同步操作。
比如,当一个订单产生时,订单所购的商品的库存量相应减少。
2、当表上某列数据的值与其他表中的数据有联系时。
比如,当某客户进行欠款消费,可以在生成订单时通过设计触发器判断该客户的累计欠款是否超过了最大限度。
3、当需要对某张表进行跟踪时。
比如,当有新订单产生时,需要及时通知相关人员进行处理,此时可以在订单表上设计触发器加以实现
以下针对第三种场合来进行代码讲解:
第一步:先创建表
//创建商品表goods
create table goods(
gid int,
name varchar(20),
num smallint
);
//创建订单表ord
create table ord(
oid int,
gid int,
much smallint
);
第二步:插入商品数据
insert into goods values(1,'cat',34),(2,'dog',23),(3,'pig',65);
第三步:创建触发器
3.1 创建insert触发器
//先修改一下分隔符。如果不修改分隔符,默认就是分号(;),但是触发器的sql语句中有分号,会默认在sql语句那结束,从而报错。为了让在end结束,需要修改分隔符
图1delimiter $
--插入数据的触发器
update goods set num=num-new.much where gid=new.gid ;这里为什么是num=num-new.much??
因为插入一行数据,就相当于添加新行new
create trigger t1
after
insert
on ord
for each row
begin
update goods set num=num-new.much where gid=new.gid ;
end$
示例:
未提交订单的goods表:
提交订单的数据如下:
提交订单提交订单后的goods表:
--删除数据的触发器
update goods set num=num+old.much where gid=old.gid;
删除一条订单,那么商品要还原回去,所以就是加回之前的数量,即(+old.much)。
create trigger t2
after
delete
on ord
for each row
begin
update goods set num=num+old.much where gid=old.gid;
end$
示例:
删掉数据前的goods表:
删掉订单:
删掉订单后的goods表:
--更新数据的触发器
update goods set num=num+old.much-new.much where gid=old.gid;
更新:就是相当于加上旧行的数量,然后减去新行的数量。
create trigger t3
after
update
on ord
for each row
begin
update goods set num=num+old.much-new.much where gid=old.gid;
end$
示例:
未修改的goods表
未修改的ord表
修改后的ord表
修改后的goods表
Ps:这是小编的小总结,各位技术大佬勿喷,但是欢迎纠错指正,小编愿闻其详。同时也希望把一些知识传播、分享给更多的人。