注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭州 QA Team

务实 专注 分享 做有态度的QA

 
 
 
 
 

日志

 
 

mysql学习之触发器——Trigger  

来自徐晗   2015-03-24 18:54:24|  分类: 默认分类 |举报 |字号 订阅

  下载LOFTER 我的照片书  |
最近在测RDS的外部实例迁移功能时,需要测试触发器、函数、存储过程的迁移,今天这篇文章主要整理下触发器的创建和作用:

触发器(trigger):在数据库中,当某种操作发生时,触发另一个操作的进行。

触发器创建语法四要素:
1、table:where,即对哪个表创建触发器;
2、insert/update/delete:即对哪些操作进行监控
3、after/before:即触发器执行时间;
4、insert/update/delete:即触发哪些操作

触发器语法:
create trigger TriggerName
after/before //触发器执行时间
 insert/update/delete  //对哪些操作进行监控
on TableName //即对哪个表进行操作
for each row   
begin
do something;   //需要执行的语句
end;

下面,用例子说明如何创建一个触发器:
1、创建两张表:
/*商品表*/
create table product
(
ProductID int primary key auto_increment,
ProductName varchar(20),
ProductNum int
);

/*订单表*/
create table order
(
OrderID int primary key auto_increment,
ProductID int,
OrderNum int
);

2、在其中的product表中插入三条记录:

insert into product(ProductName, ProductNum) values('product1',10),('product2',10),('product3',10);


现在,比如我们卖了3个product1,那么,需要写两条语句完成表的更新:

insert into order(ProductID ,OrderNum ) values(1,3);

update product set ProductNum ProductNum-3 where ProductID = 1;

其中,第一条是往订单表中增加一条记录;第二条是更新商品表的记录,将product1的量减少3。

这样比较复杂,特别是两张表的关联很强,在写代码时如果忘记的话,后果就很严重了,那触发器就是解决该问题的利器:

 创建我们第一个触发器:
delimiter //       /*mysql语句的结尾换成以双斜杠结束*/
create trigger tg1    
after insert on order
for each row 
begin
update product set ProductNum=ProductNum-3 where ProductID =  new.ProductID ;    /*对于insert而言,新插入的行用new来表示,行中的每一列的值用new.列名来表示。*/
end //
delimiter ;    /*mysql语句的结尾换回封号*/

下面,我们执行下以下语句,会发现product1的数量变为7了,说明在我们插入一条订单的时候,触发器自动帮我们做了更新操作。

insert into order(ProductID ,OrderNum  values(1,3);


至此,我们第一个触发器就完成啦。

练习一下:
当用户撤销一个订单时,即将order表中删除一条时,想把product表中商品的数量再加回去,该如何操作呢?

答案很简单:
delimiter //
create trigger tg2
after delete on order
for each row
begin
update product set ProductNumProductNum + old.OrderNum where ProductID = old.ProductID ;  /*对于delete而言:原本有一行,后来被删除,想引用被删除的这一行,用old来表示,old.列名可以引用被删除的行的值。*/
end //
delimiter ;
可以执行以下语句看下触发器有没有生效:

delete from order where OrderID = 1;


总之,触发器mysql一个很好用的高级特性,本篇也只做了一个简单的介绍,有兴趣的同学可以查看关于其的一些其它特性。
  评论这张
 
阅读(482)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016