第 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触发器在更改之后触发。
触发事件
触发器可以关联三种事件:
INSERTUPDATEDELETE
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 ;