一,概念
触发器(trigger)是MySQL提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作(insert,delete, update)时就会激活它执行。简单理解为:你执行一条sql语句,这条sql语句的执行会自动去触发执行其他的sql语句。
创建触发器的四大要素:
- 监视地点(table)
- 监视事件(insert、update、delete)
- 触发时间(after、before)
- 触发事件(insert、update、delete)
二,语法
```sql CREATE TRIGGER 触发器名 BEFORE|AFTER DELETE|INSERT|UPDATE ON 表名 FOR EACH ROW BEGIN 触发SQL代码块; END;
```
before/after: 触发器是在增删改之前执行,还是之后执行
delete/insert/update: 触发器由哪些行为触发(增、删、改)
on 表名: 触发器监视哪张表的(增、删、改)操作
触发SQL代码块: 执行触发器包含的SQL语句
说明:当我们对某个表进行增删改操作时,当符合对应的触发器监视的条件时,就会触发SQL代码块,执行语句。一个表的修改可以与另一个表的内容产生关联,触发器会自动执行。
三,查看和删除触发器
查看已有触发器: show triggers
删除已有触发器: drop trigger 触发器名称
四,for each row
这里扩展,在oracle触发器中,触发器分为行触发器和语句触发器。也就是说,假设你监视一个修改操作,它修改了1000行代码,在Oracle中触发器会触发1000次。
在oracle中,for each row如果不写,无论update语句一次影响了多少行,都只执行一次触发事件。
而MySQL中,不支持语句级触发器,所以在MySQL中并不需要在意
我们建立的数据库一般都是 InnoDB 数据库,其上建立的表是事务性表,也就是事务安全的。这时,若SQL语句或触发器执行失败,MySQL 会回滚事务,有:
①如果 BEFORE 触发器执行失败,SQL 无法正确执行。
②SQL 执行失败时,AFTER 型触发器不会触发。
③AFTER 类型的触发器执行失败,SQL 会回滚。
即当我们执行完一条SQL语句后,与之关联的触发器里面的SQL语句执行失败的话,那么我们第一次执行的SQL语句的结果会回到执行之前,发生SQL回滚
