17章MySQL:触发器

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 17章MySQL:触发器

1、为什么要使用触发器?

在实际开发中,我们经常会遇到这样的情况:有 2 个或者多个相互关联的表,如商品信息和库存信息分别存放在 2 个不同的数据表中,我们在添加一条新商品记录的时候,为了保证数据的完整性,必须同时在库存表中添加一条库存记录。


这样一来,我们就必须把这两个关联的操作步骤写到程序里面,而且要用事务包裹起来,确保这两个操作成为一个原子操作,要么全部执行,要么全部不执行。要是遇到特殊情况,可能还需要对数据进行手动维护,这样就很容易忘记其中的一步,导致数据缺失。


这个时候,就可以使用触发器。我们可以创建一个触发器,让商品信息数据的插入操作自动触发库存数据的插入操作。 这样一来,就不用担心因为忘记添加库存数据而导致的数据缺失了。


2、创建触发器语法

创建触发器的语法结构是:


CREATE TRIGGER 触发器名称 
{BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON 表名 
FOR EACH ROW 
触发器执行的语句块;


说明:


表名:表示触发器监控的对象。

BEFORE|AFTER:表示触发的时间。BEFORE 表示在事件之前触发;AFTER 表示在事件之后触发。

INSERT|UPDATE|DELETE:表示触发的事件。

INSERT 表示插入记录时触发;

UPDATE 表示更新记录时触发;

DELETE 表示删除记录时触发。

触发器执行的语句块:可以是单条SQL语句,也可以是由BEGIN…END结构组成的复合语句块。

代码举例:


先简单创建两个表


CREATE TABLE test_trigger (
id INT PRIMARY KEY AUTO_INCREMENT,
t_note VARCHAR(30)
);
CREATE TABLE test_trigger_log (
id INT PRIMARY KEY AUTO_INCREMENT,
t_log VARCHAR(30)
);


案例1:


#创建触发器:创建名称为before_insert的触发器,向test_trigger数据表插入数据之前,
#向test_trigger_log数据表中插入before_insert的日志信息。
CREATE TRIGGER before_insert
BEFORE INSERT ON test_trigger
FOR EACH ROW
INSERT INTO test_trigger_log(t_log) VALUES('beforeInsert');
#插入数据到 test_trigger表中
INSERT INTO test_trigger(t_note) VALUES('test 2');
#查询两个表的结果
SELECT * FROM test_trigger;
SELECT * FROM test_trigger_log;


查询结果:


#test_trigger表
+----+--------+
| id | t_note |
+----+--------+
|  1 | test 2 |
+----+--------+
#test_trigger_log表
+----+--------------+
| id | t_log        |
+----+--------------+
|  1 | beforeInsert |
+----+--------------+


案例2:


#定义触发器“salary_check_trigger”,基于员工表“employees”的INSERT事件,
#在INSERT之前检查将要添加的新员工薪资是否大于他领导的薪资,
#如果大于领导薪资,则报sqlstate_value为'HY000'的错误,从而使得添加失败。
DELIMITER $
CREATE TRIGGER salary_check_trigger 
BEFORE INSERT ON employees
FOR EACH ROW
BEGIN
  #声明领导的工资
  DECLARE mgr_sal DOUBLE;
  #这个NEW可以理解为java中的当前对象,即把“NEW.manager_id”可以理解为:新员工的领导的员工号
  SELECT salary INTO mgr_sal FROM employees WHERE employee_id = NEW.manager_id;
  IF NEW.salary > mgr_sal
  #这个也是一个知识点:“抛出”错误码‘HY000’,信息为:‘薪资高于领导薪资错误’
  THEN SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = '薪资高于领导薪资错误';
  END IF;
END $
DELIMITER ;
DESC employees;



当添加新员工的工资不满足上述条件时,代码演示:


INSERT INTO employees 
VALUES(301,'A','B','C','D','2021-12-14','F',50000,NULL,205,110);


因为该新员工的领导(employee_id是205) 的工资是12000,所以:上述代码就会执行失败,报“错误代码:1644 薪资高于领导薪资错误”的错误!!!


3、查看触发器

方式1:查看当前数据库的所有触发器的定义


SHOW TRIGGERS;


方式2:查看当前数据库中某个触发器的定义


SHOW CREATE TRIGGER 触发器名


方式3:从系统库information_schema的TRIGGERS表中查询触发器的信息。


SELECT * FROM information_schema.TRIGGERS;


4、 删除触发器

DROP TRIGGER  IF EXISTS 触发器名称;



相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2天前
|
关系型数据库 MySQL 数据处理
轻松入门MySQL:数据库之触发器,自动守护你的数据宝库(17)
轻松入门MySQL:数据库之触发器,自动守护你的数据宝库(17)
|
2天前
|
关系型数据库 MySQL
Mysql基础第二十八天,使用触发器
Mysql基础第二十八天,使用触发器
33 0
Mysql基础第二十八天,使用触发器
|
2天前
|
SQL 关系型数据库 MySQL
Mysql 触发器
Mysql 触发器
19 1
|
2天前
|
SQL 关系型数据库 MySQL
mysql触发器 更新大数据
【4月更文挑战第18天】
|
2天前
|
存储 SQL 关系型数据库
【MySQL 数据库】10、MySQL 的触发器
【MySQL 数据库】10、MySQL 的触发器
23 0
|
2天前
|
SQL 存储 关系型数据库
MySQL技能完整学习列表8、触发器、视图和事务——1、触发器(Triggers)的使用——2、视图(Views)的创建和使用——3、事务(Transactions)的管理
MySQL技能完整学习列表8、触发器、视图和事务——1、触发器(Triggers)的使用——2、视图(Views)的创建和使用——3、事务(Transactions)的管理
38 0
|
2天前
|
SQL 关系型数据库 MySQL
MySQL触发器 使用案例
MySQL触发器 使用案例
31 0
|
2天前
|
SQL 关系型数据库 MySQL
MySQL之如何使用触发器
MySQL之如何使用触发器
43 1
|
8月前
|
存储 SQL 关系型数据库
MySQL存储过程和触发器
MySQL存储过程和触发器
82 0
|
8月前
|
存储 关系型数据库 MySQL
使用MySQL视图与触发器
使用MySQL视图与触发器。
46 4

推荐镜像

更多