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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 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;



相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
存储 SQL 关系型数据库
Mysql学习笔记(二):数据库命令行代码总结
这篇文章是关于MySQL数据库命令行操作的总结,包括登录、退出、查看时间与版本、数据库和数据表的基本操作(如创建、删除、查看)、数据的增删改查等。它还涉及了如何通过SQL语句进行条件查询、模糊查询、范围查询和限制查询,以及如何进行表结构的修改。这些内容对于初学者来说非常实用,是学习MySQL数据库管理的基础。
141 6
|
2月前
|
SQL 关系型数据库 MySQL
Mysql学习笔记(三):fetchone(), fetchmany(), fetchall()详细总结
MySQL中用于数据检索的`fetchone()`, `fetchmany()`, `fetchall()`函数的功能、SQL语句示例和应用场景。
86 3
Mysql学习笔记(三):fetchone(), fetchmany(), fetchall()详细总结
|
2月前
|
SQL Ubuntu 关系型数据库
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
本文为MySQL学习笔记,介绍了数据库的基本概念,包括行、列、主键等,并解释了C/S和B/S架构以及SQL语言的分类。接着,指导如何在Windows和Ubuntu系统上安装MySQL,并提供了启动、停止和重启服务的命令。文章还涵盖了Navicat的使用,包括安装、登录和新建表格等步骤。最后,介绍了MySQL中的数据类型和字段约束,如主键、外键、非空和唯一等。
80 3
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
|
1月前
|
存储 SQL NoSQL
|
2月前
|
关系型数据库 MySQL 数据库
Mysql学习笔记(四):Python与Mysql交互--实现增删改查
如何使用Python与MySQL数据库进行交互,实现增删改查等基本操作的教程。
74 1
|
2月前
|
存储 SQL 关系型数据库
MySql数据库---存储过程
MySql数据库---存储过程
50 5
|
2月前
|
存储 关系型数据库 MySQL
MySQL 存储过程返回更新前记录
MySQL 存储过程返回更新前记录
69 3
|
1月前
|
存储 安全 关系型数据库
2024 Mysql基础与进阶操作系列之MySQL触发器详解(21)作者——LJS[你个小黑子这都还学不会嘛?你是真爱粉嘛?真是的 ~;以后请别侮辱我家鸽鸽]
MySQL触发器的使用场景之数据完整性约束、如何具体创建person的日志表、触发器与存储过程的对比与选择、触发器的性能和注意事项等具体操作详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
2月前
|
存储 SQL 关系型数据库
MySQL 存储过程错误信息不打印在控制台
MySQL 存储过程错误信息不打印在控制台
88 1
|
4月前
|
SQL 关系型数据库 MySQL
MySQL学习笔记
这篇文章是一份关于MySQL数据库操作的学习笔记,涵盖了数据库的终端操作、数据类型、建表约束、事务处理以及SQL的连接查询等基础知识点。