MySQL触发器

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 insertafter 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;

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值