第 37.1 节:基本触发器

创建表

mysql> CREATE TABLE account (act_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.06 sec)

CREATE TRIGGER 语句创建了一个名为 ins_sum 的触发器,它与 account 表关联。它还包含了指定触发器动作时间、触发事件以及触发时执行操作的子句。

插入值

要使用触发器,先将累加变量 @sum 置零,执行 INSERT 语句,然后查看变量值:

mysql> SET @sum = 0;
mysql> INSERT INTO account VALUES(137,14.98),(141,1937.50),(97,-100.00);
mysql> SELECT @sum AS 'Total amount inserted';

+-----------------------+
| Total amount inserted |
+-----------------------+
|               1852.48 |
+-----------------------+

在此情况下,INSERT 语句执行后 @sum 的值为 14.98 + 1937.50 - 100 = 1852.48。

删除触发器

mysql> DROP TRIGGER test.ins_sum;

如果删除一个表,该表的任何触发器也会被删除。

第 37.2 节:触发器类型

触发时机

有两种触发动作时间修饰符:

  • BEFORE 触发器在执行请求之前激活。
  • AFTER 触发器在更改之后触发。

触发事件

触发器可以关联三种事件:

  • INSERT
  • UPDATE
  • DELETE

BEFORE INSERT 触发器示例

DELIMITER $$

CREATE TRIGGER insert_date BEFORE INSERT ON stack
FOR EACH ROW
BEGIN
    -- 在插入之前设置请求中的 insert_date 字段
    SET NEW.insert_date = NOW();
END$$

DELIMITER ;

BEFORE UPDATE 触发器示例

DELIMITER $$

CREATE TRIGGER update_date BEFORE UPDATE ON stack
FOR EACH ROW
BEGIN
    -- 在更新之前设置请求中的 update_date 字段
    SET NEW.update_date = NOW();
END$$

DELIMITER ;

AFTER DELETE 触发器示例

DELIMITER $$

CREATE TRIGGER deletion_date AFTER DELETE ON stack
FOR EACH ROW
BEGIN
    -- 成功删除后添加日志条目
    INSERT INTO log_action(stack_id, deleted_date) VALUES(OLD.id, NOW());
END$$

DELIMITER ;