MySQL必知必会-第25章 使用触发器

使用触发器

1. 相关概念

1.1 版本支持:MySQL5以及之后版本;

1.2 定义

触发器是MySQL响应以下任意语句,自动执行的位于BEGIN 和 END之间的一组SQL语句;
1)INSERT;
2)DELETE;
3)UPDATE;
以上都是针对表内容的操作,视图和临时表都不支持触发器;
其他MySQL语句不支持触发器

2.使用触发器

2.1 创建触发器

1)给出唯一的触发器名;
这里的唯一指的是在“表”上唯一,即,不同的表的触发器名字可以相同;
但是尽量在同一个数据库里唯一,不同的表触发器名字都不相同。
2)触发器关联的表;
3)触发器响应的活动/操作/关键字(INSERT DELETE UPDATE);
4)触发器执行的时间,在活动/操作之前或是之后
5)触发的事件;

-- 创建触发器的基本语法
CREATE TRIGGER 触发器名  -- 唯一的触发器名
BEFORE|AFTER            -- 触发器执行的时间
INSERT|DELETE|UPDATE    -- 触发器响应的活动/操作/关键字
ON 表名					-- 触发器关联的表 
FOR EACH ROW            -- 增删改可能一次性操作多行, 每行操作都会触发
BEGIN 					-- 使用BEGIN和END可以包裹一组SQL语句触发执行
select 'hello';         -- 触发的事件,每次触发都显示一个'hello'
END;

【说明】
1)每个表每个事件每次(时间)只能定义一个触发器,因此每个表最多支持6个触发器(每条INSERT、DELETE、UPDATE语句的之前之后3*2=6);
2)单个触发器不能与多个时间或多张表关联
3)如果BEFORE触发器执行失败,将不执行请求的语句;
4)如果BEFORE触发器或是请求的语句执行失败,则不执行AFTER触发器

2.2 INSERT触发器

1)INSERT触发器的代码内,可以用名为NEW的虚拟表以NEW.列名的形式访问被插入的行;(NEW表暂时存储着之后要插入底层表的数据)
2)BEFORE触发器中,NEW中的值可以被更新,这样可以改变插入的值。
3)设置为自增的列,插入的values中若没有给出指定的值,那么在INSERT执行之前,NEW的这列为0,在INSERT完成之后,NEW的这列才包含新的自动生成的值;
例子:
对插入的每行,在插入之后打印新生成的自增量

-- orders 包含3个列,第1列自增id,第2列订单日期,第3列客户id
CREATE TRIGGER neworder 
AFTER 
INSERT 
ON orders
FOR EACH ROW
SELECT NEW.order_num;

注意
打印新生成NEW.自增量,只能通过AFTER INSERT语句;
如果使用BEFORE语句,在还没插入之前,如果自增列没有指定的值,自增列返回的就是0,而不是新生成的自增量。
【说明】
BEFORE触发器主要用于数据验证和净化,对于UPDATE触发器也是如此

2.3 DELETE触发器

1)在DELETE触发器的代码内,可以引用OLD虚拟表,访问被删除的行;
2)OLD表中的数据都是只读的,不能修改/更新;
例子:
将要被删除的行保存到一个备份表里;

CREATE TRIGGER delete_back_up 
BEFORE 
DELETE
ON orders
FOR EACH ROW
BEGIN
	INSERT INTO orders_back_up(order_num, order_date, cust_id)
	VALUES(OLD.order_num, OLD.order_date, OLD.cust_id);
END;

【说明】
1)使用BEFORE DELETE可以保证,如果存档失败,不执行请求的SQL语句,即不删除数据;
2)若使用AFTER DELETE存档失败,就没法复原了。

2.4 UPDATE触发器

1)UPDATE触发器的代码中,可以使用OLD虚拟表访问旧表的值,可以使用NEW虚拟表访问新更新的值;
2)BEFORE UPDATE中,NEW的值可能被更新,允许更改用于UPDATE语句中的值;
3)OLD表中的值全是只读的,不能更新。

3. 触发器进一步介绍

1)创建触发器可能需要特殊的安全访问权限;
2)触发器的执行是自动的,如果INSERT、DELETE、UPDATE能够执行,相关的触发器也能执行;
3)触发器可用来创建审计跟踪,把执行的SQL语句都记录到另一个表中
4)触发器应该用来保证数据的一致性(大小写、格式等);
5)触发器中不支持使用CALL语句调用存储过程,想要执行存储过程需要把存储过程的代码复制到触发器内。

你可能感兴趣的:(MySQL必知必会)