1. 触发器的概念
触发器:当表发生改变的时候触发的动作。
例子:当往表中插入数据时,此时表发生了改变,现在想要在每次插入数据前检测所有的入参是否都是小写。此时就可以用触发器检测。
经上面分析得知,使用一个基本的触发器,至少表要发生改变,还要满足一个被触发的事件。
表发生改变通常指 增删改,其动作可以发生在增删改之前或之后,触发事件就是我们需要写的过程:
- update(after/before)
- insert(after/before)
- delete(after/before)
2. 触发器的基本语法
- 创建触发器:create trigger 触发器名称 出发动作 on 表名 for each row [触发事件]
- 删除触发器:drop trigger 触发器名称;
- 查看触发器:show trigger;
知识点:
- 触发器是依赖于表创建,没有表就没有触发器。比如视图、临时表都不是真实的表,它们是没有触发器;
- 一般来说每个表都有触发器的限制,一般最多支持6个不同类型的触发器;
- 使用触发器会频繁的改变表的每行,故其十分影响性能,特别对一些更新频率比较快的大表,如果设置触发器就非常占用系统资源;
- 一般来说触发器用在表变动较小的小表,不使用触发器就立即删除。
3. insert
触发器示例
1. 创建触发器
创建一个触发器getPrice
作用于order_detail
表的每行,每当插入数据之后就查询这条订单明细的价格赋值给变量 @price
。NEW
是一张虚表,记录着被插入数据的行,因此能在NEW
表中获取每次插入的数据。
-- insert 触发器
CREATE TRIGGER getPrice AFTER INSERT ON order_detail FOR EACH ROW SELECT NEW.price INTO @price;-- 检测插入触发器
INSERT INTO `order_detail`(`detail_name`,`price`,`oid`) VALUES ('脸盆',20.00,2);SELECT @price;
- select @price 结果:
2. 删除触发器
DROP TRIGGER getPrice;
4. update
触发器示例
将插入后触发器改为更新后的触发器,只需改动after insert
为after update
即可。
UPDATE `order_detail` SET `price` = 30.00 WHERE `id` = 2;SELECT @price;
- 查询结果:
-- 删除触发器
DROP TRIGGER getPrice;
将更新触发器的NEW
表改为OLD
表
CREATE TRIGGER getPrice AFTER UPDATE ON order_detail FOR EACH ROW SELECT OLD.price INTO @price;
更新价格为40
UPDATE `order_detail` SET `price` = 40.00 WHERE `id` = 2;
此时查询价格为30,说明OLD表触发的是原始数据值
SELECT @price;
知识点:
- 更新触发器主要是要搞懂OLD存放原始数据
- NEW存放即将更新的数据
- NEW表可以设置更改值,而OLD表是只读
5. delete
触发器
将 更新触发器 改为 delete触发器。之前省略了begin、end
,如果是多条执行语句则需要加上:
CREATE TRIGGER getPrice AFTER DELETE ON order_detail FOR EACH ROW
BEGIN
SELECT OLD.price INTO @price;
END;
删除之前的SQL数据
DELETE FROM order_detail WHERE `id` = 2;
- 此时
id
=2的数据被删除
查询价格为40,OLD
表存放的是将要被删除的数据:
SELECT @price;