触发器
1、为什么要使用触发器
触发器含义:当表的某个特定事件发生前或发生后执行一些操作。如:
- 增加一条学生记录时,检查年龄是否符合范围要求
- 当删除一条学生信息时,自动删除其成绩表上对应的记录
- 每当删除一条数据时,在数据库存档表中保留一个备份副本
作用:主要用于保护表中的数据。特别是当有多个 表具有一定的相互联系的时候,触发器能够让不同的表保持数据的一致性。
在MySql中只有执行insert、update和delete操作才能激活触发器。
(1) INSERT触发器:在INSERT语句执行前或之后执行得触发器。注意以下几点
- 在INSERT触发器代码内,可引用一个名为NEW(不区分大小写)的虚拟表来访问被插入的行
- 在BEFORE INSERT触发器中,NEW中得到值也可以被更新,允许更改被插入的值(要有相对应的操作权限)
- 对于AUTO_INCREAMENT列,NEW在INSERT执行之前包含的值为0,在INSERT执行之后将包含新的自动生成值
(2) UPDATE触发器:在UPDATE语句执行前或之后执行得触发器。注意以下几点
- 在UPDATE触发器代码内,可引用一个名为NEW(不区分大小写)的虚拟表来访问更新的新值
- 在UPDATE触发器代码内,可引用一个名为OLD(不区分大小写)的虚拟表来访问UPDATE执行前的值
- 在BEFORE UPDATE触发器中,NEW中得到值也可以被更新,即允许修改将要用于UPDATE语句中的值(要有相对应的操作权限)
- OLD中的值全部是只读的,不能被更新
注意:当触发器设计对触发表自身的更新操作时,只能使用BEFORE类型的触发器,AFTER类型的触发器将不被允许。
(3) DELETE触发器:在DELETE语句执行前或之后执行得触发器。注意以下几点
- 在DELETE触发器代码内,可引用一个名为OLD(不区分大小写)的虚拟表来访问被删除的行
- OLD中的值全部是只读的,不能被更新
触发器使用过程中,MySql会按照以下方式来处理错误:
- 对于事务性表,如果触发器程序失败,则会导致整个程序失败,那么该语句所有执行的更改将回滚;对于非事务性表,失败前所做的更改依然有效。
- 若BEFORE触发器失败,则MySQL将不执行相应行上的操作
- 若在BEFORE或AFTER出发程序的执行过程中出现错误,则将导致调用出发程序的整个语句失败。
- 仅当BEFORE触发器和行操作均已被成功执行,才会执行AFTER触发器。
2、创建触发器
2.1 基本语法
CREATE <触发器名>