简单学习MySQL 触发器

缘由:

今天加班到八点半左右的时候突然看到一篇博文,是介绍 MySQL 触发器的。这一看吓一跳。原来还有这么好玩的功能。于是乎,立马忘记了自己加班是要干嘛的。大致玩耍了一下这项骚操作。在此大致记录一下。

1.触发器简介:

触发器是和表关联的特殊的存储过程,可以在插入,删除或修改表中的数据时触发执行,比数据库本身标准的功能有更精细和更复杂的数据控制能力。触发器一张表中同一个类型只能有一个。个人认为简单来说,触发器可以类似于Spring 中的切面编程。在方法(插入,删除或修改表中的数据)执行的前后进行一些操作。不过他们的实现原理应该是不一样的(这里只是作为一个猜测,有机会的话验证一下)。具体的实现原理我还没有去了解。触发器有 NEW和OLD 的概念,下面会说。

 

2.创建触发器

CREATE TRIGGER trigger_name trigger_time trigger_event ON tb_name FOR EACH ROW trigger_stmt

trigger_name:触发器的名称。
tirgger_time:触发时机,为BEFORE或者AFTER。
trigger_event:触发事件,为INSERT、DELETE或者UPDATE。
tb_name:表示建立触发器的表名,在哪张表上建立触发器。
trigger_stmt:触发器的程序体,可以是一条SQL语句或者是用BEGIN和END包含的多条语句。
FOR EACH ROW表示任何一条记录上的操作满足触发事件都会触发该触发器。

如: 

create trigger trigger_test
AFTER UPDATE ON department FOR EACH ROW
BEGIN
UPDATE users SET depart_name=NEW.name where depart_id = NEW.id;
END

MySQL中定义了NEW和OLD,用来表示触发器的所在表中,触发了触发器的那一行数据。
在INSERT型触发器中,NEW用来表示将要(BEFORE)或已经(AFTER)插入的新数据;
在UPDATE型触发器中,OLD用来表示将要或已经被修改的原数据,NEW用来表示将要或已经修改为的新数据;
在DELETE型触发器中,OLD用来表示将要或已经被删除的原数据;
使用方法:NEW.columnName(columnName为相应数据表某一列名)
另外,OLD是只读的,而NEW则可以在触发器中使用SET赋值,不会再次触发触发器,造成循环调用。

触发器一张表中同一个类型只能有一个。一张表中同一类型的触发器如果你想创建多个,会报如下错误。

3. 触发器执行顺序


InnoDB数据库,若SQL语句或触发器执行失败,MySQL会回滚事务,有:
A、如果BEFORE触发器执行失败,SQL无法正确执行。
B、SQL执行失败时,AFTER型触发器不会触发。
C、AFTER类型的触发器执行失败,SQL会回滚。
MySQL的触发器是按照BEFORE触发器、行操作、AFTER触发器的顺序执行的,其中任何一步发生错误都不会继续执行剩下的操作,如果对事务表进行的操作,如果出现错误,那么将会被回滚,如果对非事务表(戳这里了解非事务表)进行操作,那么就无法回滚,数据可能会出错。

 

目前我也只是简单地写了点小例子。浅尝辄止。参考博文中又具体的案例和优缺点描述。

参考博文:

MySQL数据库高级(五)——触发器

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值