MySQL必知必会——使用触发器

对触发器的支持是在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语句。这表示不能从触发器内调用存储过程。所需的存储过程代码需要复制到触发器内。