MySQL数据库(32):触发器 trigger-2

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: MySQL数据库(32):触发器 trigger

四、触发触发器

让触发器执行,让触发器指定的表中,对应的时机发生对应的操作

insert into my_order (item_id, count) values(1, 1);
mysql> select * from my_order;
+----+---------+-------+
| id | item_id | count |
+----+---------+-------+
|  1 |       1 |     1 |
+----+---------+-------+
1 row in set (0.00 sec)
mysql> select * from my_item;
+----+--------+-------+
| id | name   | count |
+----+--------+-------+
|  1 | 手机   |    99 |
|  2 | 电脑   |   100 |
|  3 | 包包   |   100 |
+----+--------+-------+
3 rows in set (0.00 sec)

五、删除触发器

drop trigger 触发器名字;
-- eg
drop trigger after_insert_order_trigger;

六、触发器的应用

记录关键字 new old

6.1 完善

商品自动扣除库存

触发器针对的是数据表中的每条记录,每行数据再操作前后都有一个对应的状态

触发器在执行之前就将对应的数据状态获取到了:

  • 将没有操作之前的数据状态都保存到old关键字中
  • 操作后的状态都放在new

触发器中,可以通过old和new来获取绑定表中对应的记录数据

基本语法

关键字.字段名

old和new并不是所有触发器都有

  • insert 插入前为空,没有old
  • delete 清除数据,没有new

商品自动扣减库存

delimiter $$
create trigger after_insert_order_trigger after insert on my_order for each row
begin
    -- 通过new关键字获取新数据的id 和数量
    update my_item set count = count - new.count where id = new.item_id;
end
$$
delimiter ;

触发触发器

mysql> select * from my_order;
+----+---------+-------+
| id | item_id | count |
+----+---------+-------+
|  1 |       1 |     1 |
+----+---------+-------+
mysql> select * from my_item;
+----+--------+-------+
| id | name   | count |
+----+--------+-------+
|  1 | 手机   |    99 |
|  2 | 电脑   |   100 |
|  3 | 包包   |   100 |
+----+--------+-------+
insert into my_order (item_id, count) values(2, 3);
mysql> select * from my_order;
+----+---------+-------+
| id | item_id | count |
+----+---------+-------+
|  1 |       1 |     1 |
|  2 |       2 |     3 |
+----+---------+-------+
mysql> select * from my_item;
+----+--------+-------+
| id | name   | count |
+----+--------+-------+
|  1 | 手机   |    99 |
|  2 | 电脑   |    97 |
|  3 | 包包   |   100 |
+----+--------+-------+

6.2 优化

如果库存数量没有商品订单多怎么办?

-- 删除原有触发器
drop trigger after_insert_order_trigger;
-- 新增判断库存触发器
delimiter $$
create trigger after_insert_order_trigger after insert on my_order for each row
begin
    -- 查询库存
    select count from my_item where id = new.item_id into @count;
    -- 判断
    if new.count > @count then
        -- 中断操作,暴力抛出异常
        insert into xxx values ('xxx');
    end if;
    -- 通过new关键字获取新数据的id 和数量
    update my_item set count = count - new.count where id = new.item_id;
end
$$
delimiter ;

结果验证

mysql> insert into my_order (item_id, count) values(3, 101);
ERROR 1146 (42S02): Table 'mydatabase2.xxx' doesn't exist
mysql> select * from my_order;
+----+---------+-------+
| id | item_id | count |
+----+---------+-------+
|  1 |       1 |     1 |
|  2 |       2 |     3 |
+----+---------+-------+
2 rows in set (0.00 sec)
mysql> select * from my_item;
+----+--------+-------+
| id | name   | count |
+----+--------+-------+
|  1 | 手机   |    99 |
|  2 | 电脑   |    97 |
|  3 | 包包   |   100 |
+----+--------+-------+
3 rows in set (0.00 sec)
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
关系型数据库 MySQL
Mysql基础第二十八天,使用触发器
Mysql基础第二十八天,使用触发器
28 0
Mysql基础第二十八天,使用触发器
|
28天前
|
存储 SQL 数据挖掘
视图、触发器和存储过程:提升数据库功能
视图、触发器和存储过程:提升数据库功能
19 1
|
1月前
|
存储 SQL 关系型数据库
【MySQL 数据库】10、MySQL 的触发器
【MySQL 数据库】10、MySQL 的触发器
20 0
|
2月前
|
SQL 存储 关系型数据库
MySQL技能完整学习列表8、触发器、视图和事务——1、触发器(Triggers)的使用——2、视图(Views)的创建和使用——3、事务(Transactions)的管理
MySQL技能完整学习列表8、触发器、视图和事务——1、触发器(Triggers)的使用——2、视图(Views)的创建和使用——3、事务(Transactions)的管理
34 0
|
3月前
|
SQL 关系型数据库 MySQL
MySQL触发器 使用案例
MySQL触发器 使用案例
29 0
|
4月前
|
SQL 关系型数据库 MySQL
MySQL之如何使用触发器
MySQL之如何使用触发器
40 1
|
4月前
|
存储 SQL 定位技术
数据库基础(五):存储过程与触发器的创建、执行、修改、删除
数据库基础(五):存储过程与触发器的创建、执行、修改、删除
|
4月前
|
SQL 关系型数据库 MySQL
⑩⑥ 【MySQL】详解 触发器TRIGGER,协助 确保数据的完整性,日志记录,数据校验等操作。
⑩⑥ 【MySQL】详解 触发器TRIGGER,协助 确保数据的完整性,日志记录,数据校验等操作。
37 0
|
4月前
|
SQL 关系型数据库 MySQL
My Sql 触发器
My Sql 触发器
|
4月前
|
SQL 关系型数据库 MySQL
认真学习MySQL 中的触发器
认真学习MySQL 中的触发器
46 1
认真学习MySQL 中的触发器