触发器是用户得以在关系表上的一类有事件驱动的数据库对象,也是一种保证数据完整性的方法;
触发器一旦定义,无需用户调用,任何对表的修改操作均由数据库服务器自动激活相应的触发器。
触发器的主要作用是实现主键和外键不能保证的复杂的参照关系性和数据的一致性,从而保护表中数据;
一,创建触发器
语法:
create trigger 触发器名称 trigger_time 触发事件
on 表名 for each row 触发器主体
触发器名称:名称在当前数据库中必须是唯一的
解释:
trigger_time:指定触发器被触发的时刻,它有两个选项关键字 defore 和关键字 after 用于表示触发器是在激活它的语句之前或者之后触发。如果希望验证新数据是否满足使用限制,则使用 before
触发事件:用于指定触发事件,即指定激活触发器的语句的种类,可以是 insert 表示将新的数据行插入到表时激活触发器; update 表示更改表中某一行数据时激活触发器;delete 表示从表中删除某一行数据时激活触发器。
表名:与触发器相关联的表名,必须引用永久性表且同一个表不能拥有两个具有相同触发时刻和事件的触发器
for each row:指定对于受触发事件影响的每一行都要激活触发器的动作。例如 用 insert 向一个表中插入多行数据时,触发器会对每一行数据的插入都执行相应触发器动作。
触发器主体:指定触发器动作主体。包含触发器激活时将要执行的MySQL语句。如果执行多个语句使用 begin...end
触发器的创建中,每个表每个事件只允许一个触发器。因此每个表最多支持 6 个触发器,即每条 insert ,update和 delete的“之前”和之后。
单一触发器不能与多个事件或多个表相连,例如需要一个对 insert 和 update 操作执行的触发器,应该定义两个;
二,删除触发器
语法格式:
drop trigger [ if exists][数据库名]触发器名称
数据库名:指定触发器所在的数据库的名称,若没有指定则为当前默认数据库;
drop trigger if exists 数据库名;
需要注意的是:当删除一个表的同时,也会自动地删除该表上的触发器,且触发器不能更新或覆盖,为了修改一个触发器必须先删除她,然后在重新创建;
三,使用触发器
1.insert触发器
注意
在 insert 触发器代码内,可引用一个名为 new 的虚拟表,来访问被插入的行
在 before insert 触发器中,new中的值也可以被更新,允许修改被插入的值
对于 auto_increment 列,new在 insert 执行之前包含的是 0 值,在insert 执行之后将包含新的自动生成值。
2.delete 触发器
注意:
delete触发器代码内,可以引用一个名为old 的虚拟表来访问被删除的行
old 中的值全部是只读的,不能被更新
3.update触发器
注意
1)update触发器代码内,可以引用一个名为 old 的虚拟表访问以前(update语句执行前)的值,也可以引用一个名为 new 的虚拟表访问更新后的值
2)在 before update触发器中, new 中的值可能也被更新,即即使更改将要用于 update 语句中的值
3)old 中的值全部是只读的,不能被更新
4)当触发器手机对触发表自身的更新操作时,只能使用 before update触发器