触发器(trigger)是数据库中的一个重要概念。触发器是与表相关联的命名数据库对象,当表上发生特定事件时,触发器会被激活。
触发器定义为在语句插入、更新或删除关联表中的行时激活。这些行操作是触发事件。例如,可以通过INSERT或LOAD DATA语句插入行,并为每个插入的行激活插入触发器。触发器可以设置为在触发事件之前或之后激活。例如,可以在表中插入的每一行之前或更新的每一行都激活触发器。
MySQL触发器仅针对SQL语句对表所做的更改而激活。这包括对作为可更新视图基础的基表的更改。对于不将SQL语句传输到MySQL Server的API对表所做的更改,触发器不会激活。这意味着触发器不会被使用NDB API进行的更新激活。
INFORMATION_SCHEMA或performance_SCHEMA表中的更改不会激活触发器。这些表实际上是视图,不允许在视图上使用触发器。
以下部分描述了创建和删除触发器的语法,显示了一些如何使用触发器的示例,并指示了如何获取触发器元数据。
这里有一个简单的例子,它将触发器与表相关联,以激活INSERT操作。触发器充当累加器,将插入表的某一列的值相加。
mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
Query OK, 0 rows affected (0.03 sec)
mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
FOR EACH ROW SET @sum = @sum + NEW.amount;
Query OK, 0 rows affected (0.01 sec)
CREATE TRIGGER语句创建一个名为ins_sum的触发器,该触发器与account表相关联。它还包括指定触发器动作时间、触发事件以及触发器激活时要做什么的条款:
- 关键字BEFORE表示触发器动作时间。在这种情况下,触发器会在每一行插入表之前激活。这里允许的另一个关键字是AFTER。
- 关键字INSERT表示触发事件;即激活触发器的操作类型。在该示例中,INSERT操作会导致触发器激活。您还可以为DELETE和UPDATE操作创建触发器。
- FOR EACH ROW后面的语句定义了触发器主体;也就是说,每次触发器激活时要执行的语句,对于受触发事件影响的每一行都会发生一次。在该示例中,触发器主体是一个简单的SET,它将插入金额列的值累积到用户变量中。该语句将该列称为NEW.amount,意思是“要插入新行的金额列的值”