触发器是MySQL响应以下任意语句而自动执行的一条MySQL语句(或位于BEGIN和END语句之间的一组语句)
-
DELETE
-
INSERT
-
UPDATE
其他MySQL语句不支持触发器
创建触发器
在创建触发器时, 需要给出4条信息
-
唯一的触发器名
-
触发器关联的表
-
触发器应该响应的活动(DELETE、INSERT或UPDATE)
-
触发器何时执行(处理之前或之后)
触发器名必须在每个表中唯一, 但不是在每个数据库中唯一。这表示同一数据库中的两个表可具有相同的名字的触发器
触发器用CREATE TRIGGER语句创建
MariaDB [crashcourse]> CREATE TRIGGER newproduct AFTER INSERT ON products FOR EACH ROW SELECT 'Product added'
只有表才支持触发器, 视图不支持(临时表也不支持)
触发器按每个表每个事件每次的定义, 每个表每个事件每次只允许一个触发器。因此, 每个表最多只支持6个触发器(每条INSERT、UPDATE、DELETE之前和之后)。单一触发器不能与多个事件或多个表关联。
删除触发器
为了删除触发器, 可以使用DROP TRIGGER语句
MariaDB [crashcourse]> DROP TRIGGER newproduct;
触发器不能更新或覆盖, 为了修改一个触发器, 必须先删除它, 然后重新创建
使用触发器
INSERT触发器
INSERT触发器在INSERT语句执行之前或执行之后执行。
- 在INSERT触发器代码内, 可引用一个名为NEW的虚拟表, 访问被插入的行
- 在BEFORE INSERT触发器中, NEW中的值也可以被更新(允许更改插入的值)
- 对于AUTO_INCREMENT列, NEW在INSERT执行之前包含0, 在INSERT执行之后包含新的自动生成的值
MariaDB [crashcourse]> CREATE TRIGGER neworder AFTER INSERT ON orders FOR EACH ROW SELECT NEW.order_num;
DELETE触发器
DELETE触发器在DELETE语句执行之前或之后执行。
- 在DELETE触发器代码中, 可以引用一个名为OLD的虚拟表, 访问被删除的行
- OLD中的值全都是只读的, 不能更新
MariaDB [crashcourse]> CREATE TRIGGER deleteorder BEFORE DELETE ON order FOR EACH ROW BEGIN INSERT INTO archive_orders(order_num, order_date, cust_id) VALUES(OLD.order_num, OLD.order_date, OLD.cust_id) END;
使用BEFORE DELETE触发器的优点(相当于AFTER DELETE)在于, 如果由于某种原因, 订单不能存档, DELETE本身将被放弃
UPDATE触发器
UPDATE触发器在UPDATE语句执行之前或之后执行
- 在UPDATE触发器中, 可以引用一个名为OLD的虚拟表访问以前(UPDATE之前)的值, 引用一个名为NEW的虚拟表访问新更新的值
- 在BEFORE UPDATE触发器中, NEW中的值可能也被更新(允许更改将要用与UPDATE语句中的值)
- OLD中的值全都是只读的, 不能更新
MariaDB [crashcourse]> CREATE TRIGGER updatevendor BEFORE UPDATE ON vendors FOR EACH ROW SET NEW.vend_state=Upper(NEW.vend_state)