触发器在满足定义条件时触发,并执行触发器中定义的语句集合,这使得我们可以利用触发器做一些有用的事情,比如在新增、更新记录时记录操作的时间,在删除记录时把记录进行备份或写日志。

来个简单示例,先创建一个表:

mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));

再创建触发器:

mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
-> FOR EACH ROW SET @sum = @sum + NEW.amount;

该触发器定义了在向 account 表插入数据时会汇总 amount 字段的值到 @sum 用户变量中,这样我们就可以在每次执行插入后读取该用户变量,例如:

mysql> SET @sum = 0;
mysql> INSERT INTO account VALUES(10, 10.23),(12, 137.50),(13, -100.00);
mysql> SELECT @sum AS 'Total Amount Inserted';

输出:

+-----------------------+
| Total Amount Inserted |
+-----------------------+
| 47.73 |
+-----------------------+

简单的触发器演示完了,删除这个触发器:

mysql> DROP TRIGGER test.ins_sum;

触发器可以附加到下面三个事件:

  • INSERT

  • UPDATE

  • DELETE

INSERT 事件触发器示例:

DELIMITER $$
CREATE TRIGGER insert_date
BEFORE INSERT ON stack
FOR EACH ROW
BEGIN
-- 在插入执行之前对 insert_date 字段赋值
SET NEW.insert_date = NOW();
END;

$$
DELIMITER ;

UPDATE 事件触发器示例:

DELIMITER $$
CREATE TRIGGER update_date
BEFORE UPDATE ON stack
FOR EACH ROW
BEGIN
-- 在更新执行之前对 update_date 字段赋值
SET NEW.update_date = NOW();
END;

$$
DELIMITER ;

DELETE 事件触发器示例:

DELIMITER $$
CREATE TRIGGER deletion_date
AFTER DELETE ON stack
FOR EACH ROW
BEGIN
-- 在删除成功之后向 log_action 表插入一条删除日志
INSERT INTO log_action(stack_id, deleted_date) VALUES(OLD.id, NOW());
END;

$$
DELIMITER ;