目录
如果你想要某条语句(或某些语句)在事件发生时自动执行
每当增加一个顾客到某个数据库表时,都检查其电话号码格式是否正确,州的缩写是否为大写;
每当订购一个产品时,都从库存数量中减去订购的数量;
无论何时删除一行,都在某个存档表中保留一个副本。
的共同之处是它们都需要在某个表发生更改时自动处理。
触发器
是
MySQL
响应以下任意语句而自动执行的一条MySQL
语句(或位于
BEGIN
和
END
语句之间的一组语
句):
DELETE
INSERT
UPDATE
其他MySQL语句不支持触发器
创建触发器
唯一的
触发器名
触发器
关联的表
触发器应该
响应的活动
(
DELETE
、
INSERT
或
UPDATE
)
触发器
何时执行
(处理之前或之后)
创建触发器
触发器只支持表,
不支持视图
触发器按每个表每个事件每次地定义,
每个表每个事件每次只允许一个触发器
。因此,每个表
最多支持6个触发器
(每条
INSERT
、
UPDATE和DELETE
的之前和之后)
单一触发器不能与多个事件或多个表关联
,所以,如果你需要一个对INSERT
和
UPDATE
操作执行的触发器,则应该定义
两个触发器。
删除触发器
使用触发器
INSERT触发器
INSERT触发器在INSERT语句执行之前或之后执行
在
INSERT
触发器代码内,可引用一个
名为NEW的虚拟表
,访问被插入的行;
在
BEFORE INSERT
触发器中,
NEW中的值也可以被更新
(允许更改被插入的值);
对于
AUTO_INCREMENT列
,
NEW
在
INSERT
执行之前包含
0
,在
INSERT执行之后包含新的自动生成值。
测试INSERT触发器
DELETE触发器
DELETE触发器在DELETE语句执行之前或之后执行
在
DELETE
触发器代码内,你可以引用一个名为
OLD
的虚拟表,访问被删除的行;
OLD
中的值全都是只读的,不能更新。
演示使用
OLD
保存将要被删除的行到一个存档表中
使用
BEFORE DELETE触发器的优点
(相对于
AFTER DELETE
触发器来说)为,如果由于某种原因,订单不能存档,DELETE
本身将被放弃
UPDATE触发器
UPDATE触发器在UPDATE语句执行之前或之后执行
在UPDATE触发器代码中,你可以引用一个名为OLD的虚拟表访问以前(UPDATE语句前)的值,引用一个名为NEW的虚拟表访问新更新的值;
在BEFORE UPDATE触发器中,NEW中的值可能也被更新(允许更改将要用于UPDATE语句中的值);
OLD
中的值全都是只读的,不能更新。
例子保证州名缩写总是大写(不管
UPDATE
语句中给出的是大写还是小写)
关于触发器的进一步介绍
与其他
DBMS
相比,
MySQL 5中支持的触发器相当初级
。未来的
MySQL
版本中有一些改进和增强触发器支持的计划。
创建触发器可能需要特殊的安全访问权限
,但是,触发器的执行是自动的。如果INSERT
、
UPDATE
或
DELETE
语句能够执行,则相关的触发器也能执行。
应该
用触发器来保证数据的一致性(大小写、格式等)
。在触发器中执行这种类型的处理的优点是它总是进行这种处理,而且是透明地进行,与客户机应用无关
触发器的一种非常有意义的使用是
创建审计跟踪
。使用触发器把
更改(如果需要,甚至还有之前和之后的状态)记录到另一个
表非常容易
。
遗憾的是,
MySQL
触发器中不支持
CALL
语句。这表示
不能从触发器内调用存储过程
。所需的存储过程代码需要复制到触发器内。