RJ博客

触发器的使用

本文目录

MySQL触发器

1. 概念

触发器(Trigger)是一个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件触发。
触发器经常用于加强数据的完整性约束和业务规则等。

2. 语法

CREATE TRIGGER 触发器名称 BEFORE|AFTER 触发事件
ON 表名 FOR EACH ROW
  BEGIN
    触发器程序体  
  END
  
  -- 触发器名称,它和MySQL中其他对象的命名方式
  -- {BEFORE|AFTER} 触发器触发的时机
  -- {INSERT|UPDATE|DELETE} 触发器事件
  -- FOR EACH ROW 子句通知触发器每隔一行执行一次动作,而不是对整个表执行一次。
  -- (针对insert和delete语句,每一行都触发)

触发器中newold的作用

  1. 针对update操作,new表示的是更新后的值,old表示的是原来的数据。

  2. 针对insert操作,new表示的是插入的值。

  3. 针对delete操作,old表示的是删除后的值。

2. 业务实例

现在博客文章表有个评论数字段,该字段的值需要随评论表的增删改而变动,写在PHP代码里面实现不方便维护,评论屏蔽状态下(status=0)不计入评论数。通过触发器实现如下:

注意:mysql 默认结束符号是分号,当你在写触发器或者存储过程时有分号出现,会中止转而执行,所以可以通过delimiter ||制定结束符为||,运行完命令再制定回delimiter ;

update评论状态触发器:

delimiter ||
drop trigger if exists hd_comment_after_update||
CREATE TRIGGER `hd_comment_after_update` AFTER update
ON `hd_comment` FOR EACH ROW
begin
update hd_blog set comment_count=comment_count+new.status-old.status where id=old.bid;
end||
delimiter ;

delete评论触发器:

delimiter ||
drop trigger if exists hd_comment_after_delete||
CREATE TRIGGER `hd_comment_after_delete` AFTER delete
ON `hd_comment` FOR EACH ROW
begin
update hd_blog set comment_count=comment_count-old.status where id=old.bid;
end||
delimiter ;

insert评论触发器:

delimiter ||
drop trigger if exists hd_comment_after_insert||
CREATE TRIGGER `hd_comment_after_insert` AFTER insert
ON `hd_comment` FOR EACH ROW
begin
update hd_blog set comment_count=comment_count+new.status where id=new.bid;
end||
delimiter ;


references:

http://www.jianshu.com/p/8d62bef8688c

http://blog.51yip.com/mysql/695.html

相关推荐

发表评论