对触发器的支持是在MySQL 5中增加的。触发器是MySQL响应以下任意语句而自动执行的一条MySQL语句(或位于begin 和 end 语句之间的一组语句):
1)delete;
2)insert;
3)update。
其他MySQL语句不支持触发器。
在创建触发器时,需要给出以下信息:
1)唯一的触发器名;
2)触发器关联的表;
3)触发器应该响应的活动(delete、insert或update);
4)触发器何时执行(处理之前或之后)。
在MySQL 5中,触发器名必须唯一,但不是在每个数据库中唯一。这表示同一数据库的两个表可具有相同名字的触发器。这在其他每个数据库触发器名必须唯一的DBMS中是不允许的,而且以后的MySQL版本很可能会使命名规则更为严格。因此,现在最好是在数据库范围内使用唯一的触发器名。
触发器用 crate trigger 语句创建。只有表才支持触发器,视图不支持(临时表也不支持)。
触发器按每个表每个事件每次地定义,每个表每个事件每次只允许一个触发器。因此,每个表最多支持6个触发器(每条insert、update和delete的之前和之后)。单一触发器不能与多个事件或多个表关联。所以,如果需要对一个insert和update操作执行的触发器,则应该定义两个触发器。
如果 before 触发器失败,则MySQL将不执行请求的操作。此外,如果 before 触发器或语句本身失败,MySQL将不执行 after 触发器(如果有的话)。
触发器不能更新或覆盖。为了修改一个触发器,必须先删除它,然后再重新创建。删除触发器语句为 drop trigger 触发器名。
insert触发器在insert语句之前执行或之后执行。同时要清楚以下几点:
1)在insert触发器代码内,可引用一个new的虚拟表,访问被插入的行。
2)在before insert 触发器中,new中的值也可以被更新(允许更改被插入的值)。
3)对于 auto_increment 列,new在insert执行之前包含0,在insert执行之后包含新的自动生成值。
通常将before用于数据验证和净化(目的是保证插入表中的数据确实是需要的数据)。
delete触发器在delete语句执行之前或之后执行,同时要清楚以下两点:
1)在delete触发器代码内,可以引用一个名为 old 的虚拟表,访问被删除的行。
2)old 中的值全都是只读的,不能更新。
多语句触发器:触发器可以使用begin和end语句标记触发器体。使用begin end块的好处就是触发器能容纳多条SQL语句(在begin end 块中一条挨着一条)。
update触发器在update语句执行之前或之后执行,同时要清楚以下几点:
1)在update触发器代码内,可以引用一个名为 old 的虚拟表访问以前(update语句前)的值,引用一个名为new的虚拟表访问新更新的值。
2)在before update 触发器中,new中的值可能也被更新(允许更改将要用于update语句中的值)。
3)old 中的值全都是只读的,不能更新。
使用触发器时记住以下几点:
1)与其他DBMS相比,MySQL 5中支持的触发器想当初级。
2)创建触发器可能需要特殊的安全访问权限,但是,触发器的执行是自动的。如果,insert、update和delete语句能够执行,则相关的触发器也能执行。
3)应该用触发器来保证数据的一致性(大小写、格式等)。在触发器中执行这种类型的处理的优点是它总是进行这种处理,而且是透明地进行,与客户机应用无关。
4)触发器的一种非常有意义的使用是创建审计跟踪。使用触发器,把更改(如果需要,甚至还有之前和之后的状态)记录到另一个表非常容易。
5)MySQL触发器不支持call语句。这表示不能从触发器内调用存储过程。所需的存储过程代码需要复制到触发器内。