MySQL学习笔记 05、触发器、存储过程、存储函数、定时任务(一)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL学习笔记 05、触发器、存储过程、存储函数、定时任务(一)

一、触发器


触发器:在满足某种条件的时候,被动执行的SQL语句。


特性:


有begin、end的结构体(针对于多条sql语句)


需要指定触发的条件(触发时机):INSERT,UPDATE,DELETE


有指定的触发时间:BEFORE,AFTER


使用时机说明:


BEFORE|AFTER INSERT用于获取将要插入的数据

BEFORE|AFTER UPDATE|DELETE用于获取已经修改或删除的数据


提前准备测试表



DROP TABLE IF EXISTS `course`;
CREATE TABLE `course`  (
  `id` int(11) NOT NULL,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (
  `id` int(11) NOT NULL,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `sex` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;


1.1、创建触发器


单条业务逻辑


单条业务逻辑:即触发条件成立执行一条sql语句


-- 添加触发器:插入到student表后,触发插入课程记录一条
CREATE TRIGGER trigger_insert  -- 触发器名称
AFTER INSERT  -- 插入后触发
ON student  -- 指定表
FOR EACH ROW 
INSERT INTO course(name) VALUES('英语课')  -- 执行触发器的操作
-- 测试语句
insert student(name,sex) values('xiaotian','男')




多条业务逻辑


多条业务逻辑:即触发条件成立执行多条sql语句,需要使用begin end包裹多条sql语句


-- 添加触发器:在插入学生表一条记录前插入course表两条记录
DELIMITER $   -- 设置默认结束符为$,原本是;表示提交结束符
CREATE TRIGGER trigger_insert_before -- 触发器名称
BEFORE INSERT  -- 插入前触发
ON student  -- 指定表
FOR EACH ROW 
BEGIN 
  INSERT INTO course(name) VALUES('数学课');
  INSERT INTO course(name) VALUES('语文课');
END;$  -- 将触发器进行提交
-- 测试语句
insert student(name,sex) values('xiaotian','男')


注意点:默认结束提交符号为;,在多条业务逻辑中SQL语句需要以;为结尾,所以需要使用DELIMITER $来设置结束符号。

区别:单条业务的话不需要设置结束符号;多条业务的话需要使用begin end来包裹多条业务语句并且需要修改结束符号。



1.2、删除触发器


语法:DROP TRIGGER 触发器名称


实际使用:


-- 删除前面创建的两个触发器
drop TRIGGER trigger_insert;
drop TRIGGER trigger_insert_before;



二、存储过程


2.1、认识变量


2.1.1、系统变量


由mysql数据库管理系统提供的,变量名称固定,可以修改和查看值,分为全局变量和会话变量。


全局变量:当mysql服务没有重启时,我们可以查看和修改的变量。


会话变量:和MySQL连接形成的会话,生命周期在整个会话过程中。


全局变量用global修饰,会话变量用session修饰,通常session可以省略(即省略默认为session)。


查看系统变量:mysql5.7.32版本


SHOW GLOBAL variables;  -- 查看所有全局变量(503)
SHOW SESSION variables;  -- 查看所有会话变量(517)
SHOW variables;  -- 查看所有会话变量
SHOW GLOBAL variables like '%dir%'; -- 模糊查询环境变量
SELECT @@datadir;  -- 查看全局系统变量
SELECT @@session_track_transaction_info;


修改系统变量:


-- ①设置自动提交事务改为手动提交(全局)
SHOW GLOBAL variables like 'autocommit';   -- 全局系统变量中为自动提交事务
SET GLOBAL autocommit=0;  -- 将全局的自动提交的事务改为手动提交
-- ①设置自动提交事务改为手动提交(会话)
SHOW SESSION variables like 'autocommit';  -- 查看会话变量中自动提交事务
SET SESSION autocommit=0;  -- 将会话变量中自动提交的事务改为手动提交
-- 其他方式设置全局、会话变量
SET @@session.autocommit=1; -- 设置会话变量
SET @@global.autocommit=1;-- 设置全局变量


注意:


全局变量在修改后,在不同的会话中都会立即生效,但是在重新启动mysql服务后,全局变量会恢复为默认值,如果想让全局变量依旧有效,需要去修改.ini文件(MySQL配置文件)。

会话变量在修改后只对当前会话有效。一般在开发过程中修改会话变量。如:字符编码格式等可以在ini文件中进行设置。


2.1.2、用户变量


MySQL允许用户自定义变量,分为用户变量和局部变量。


用户变量


作用域:当前会话有效。


语法:设置方式(两种)


-- 方式一:先去声明并初始化用户变量,赋值操作既可以使用=进行赋值,也可以使用:=进行赋值
SET @变量名=值;
SET @变量名:=值;
SELECT @变量名:=值; -- 注意使用select进行初始化与赋值会返回变量名及值
-- 方式二:查询好结果之后赋值到某个变量中
SELECT 字段 into @变量名 FROM 表名;  -- 也相当于初始化以及赋值操作


实际演示:


-- 方式一
set @aa = 123456
set @aa:=456789
select @aa:= 789123  -- 初始化赋值并返回值
-- 测试:获取用户变量
select @aa
-- 方式二
select count(*) into @bb FROM student;
-- 测试:获取用户变量
SELECT @bb;


局部变量


作用域:在begin end的结构体中,声明必须是begin end结构体的第一句


语法:声明方式及赋值操作


#声明方式,必须在begin后面从第一行开始
DECLARE 变量名 类型;
DECLARE 变量名 类型 DEFAULT 值; -- 声明并赋值
# 局部变量的赋值操作
SET 变量名:=值;
SELECT @变量名:=值;
SELECT 字段 into 变量名 FROM 表名;


注意点:不能直接单独使用局部变量,一般用于在存储过程以及存储函数中使用!



2.2、存储过程创建


语法介绍


存储过程:一组已经预先编译好的sql语句的集合,理解为批处理语句(增加流程控制语句),一般在复杂逻辑中才会使用存储过程。


创建语法介绍:如果存储过程中只有一条SQL语句可以省略BEGIN END。


DELIMITER$
CREATE PROCEDURE 存储过程的名称(参数列表)  -- 单个值为:参数模式 形参名称 参数类型
BEGIN
  局部变量的定义多条sql
  语句流程控制语句
END;$


参数列表:



in:表示输入参数(一般调用时传入)。out:表示输出参数,调用时可传入用户变量来获取。inout:前两个的结合。

调用存储过程:


-- 实参列表中包含由输出类型的参数
CALL 存储过程的名称(实参列表)


实操演示


下面是创建以及调用案例:


-- 创建存储过程:
-- 参数2个:name->输入,插入student表一条记录的名称。
--          sum -> 输出,返回studnet、course表的总记录
DELIMITER$
CREATE PROCEDURE insertStu(in name varchar(20),out sum int)
BEGIN
  DECLARE s1 int DEFAULT 0;
  DECLARE c1 int DEFAULT 0;
  INSERT into student(name,sex) VALUES(name,'男');  -- 1、插入一条记录到student中
  -- 2、查询student、course表中的所有记录数合并到sum变量中
  SELECT count(*) into s1 FROM student;
  SELECT count(*) into c1 FROM student;
  set sum:=s1+c1; -- 局部变量赋值操作
END;$
-- 测试存储过程
SET @sum:= 0;
CALL insertStu('小天天',@sum);
SELECT @sum;  -- 获取用户变量





2.3、删除存储过程


语法:DROP PROCEDURE 存储过程名称


实操:删除上面创建的存储过程


drop PROCEDURE insertStu;



2.4、查看存储过程


语法:SHOW CREATE PROCEDURE 存储过程名称;


实操:查看上面创建的存储过程


show create PROCEDURE insertStu;



相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
13天前
|
SQL 关系型数据库 MySQL
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
31 1
|
26天前
|
存储 关系型数据库 MySQL
PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)
PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)
21 2
|
11天前
|
存储 安全 关系型数据库
2024 Mysql基础与进阶操作系列之MySQL触发器详解(21)作者——LJS[你个小黑子这都还学不会嘛?你是真爱粉嘛?真是的 ~;以后请别侮辱我家鸽鸽]
MySQL触发器的使用场景之数据完整性约束、如何具体创建person的日志表、触发器与存储过程的对比与选择、触发器的性能和注意事项等具体操作详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
1月前
|
存储 SQL 关系型数据库
MySQL 存储函数及调用
MySQL 存储函数及调用
36 3
|
1月前
|
存储 关系型数据库 MySQL
MySQL 如何存储地理信息
MySQL 如何存储地理信息
80 1
|
2月前
|
存储 关系型数据库 MySQL
深入解析MySQL数据存储机制:从表结构到物理存储
深入解析MySQL数据存储机制:从表结构到物理存储
115 1
|
26天前
|
存储 关系型数据库 MySQL
Key_Value 形式 存储_5级省市城乡划分代码 (mysql 8.0 实例)
本文介绍了如何使用MySQL8.0数据库中的Key_Value形式存储全国统计用区划代码和城乡划分代码(5级),包括导入数据、通过数学函数提取省市区信息,以及查询5级行政区划的详细数据。
27 0
|
3月前
|
存储 关系型数据库 MySQL
MySQL 中的触发器数量之谜
【8月更文挑战第31天】
36 0
|
3月前
|
SQL 数据采集 关系型数据库
|
5月前
|
存储 SQL 关系型数据库
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】(2)
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】

推荐镜像

更多
下一篇
无影云桌面