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

本文涉及的产品
RDS Agent(兼容OpenClaw),2核4GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
简介: 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;



相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
人工智能 运维 Java
SpringBoot+MySQL实现动态定时任务
这是一个基于Spring Boot的动态定时任务Demo,利用spring-context模块实现任务调度功能。服务启动时会扫描数据库中的任务表,将任务添加到调度器中,并通过固定频率运行的ScheduleUpdater任务动态更新任务状态和Cron表达式。核心功能包括任务的新增、删除与Cron调整,支持通过ScheduledFuture对象控制任务执行。项目依赖Spring Boot 2.2.10.RELEASE,使用MySQL存储任务信息,包含任务基类ITask及具体实现(如FooTask),便于用户扩展运维界面以增强灵活性。
385 10
|
存储 Java 关系型数据库
java调用mysql存储过程
在 Java 中调用 MySQL 存储过程主要借助 JDBC(Java Database Connectivity)。其核心原理是通过 JDBC 与 MySQL 建立连接,调用存储过程并处理结果。具体步骤包括:加载 JDBC 驱动、建立数据库连接、创建 CallableStatement 对象、设置存储过程参数并执行调用。此过程实现了 Java 程序与 MySQL 数据库的高效交互。
|
8月前
|
SQL 关系型数据库 MySQL
如何创建RDS MySQL定时任务?
RDS MySQL支持通过事件调度器(Event Scheduler)实现定时任务,如数据清理、统计报告等。需先开启Event Scheduler,再通过DMS或SQL创建、查看、删除事件,自动化执行数据库操作,提升运维效率。
|
关系型数据库 MySQL 调度
如何在MySQL中创建定时任务?
MySQL 事件调度器(Event Scheduler)可实现定时任务自动化。例如,每天凌晨清空 `test` 表,并在一个月后自动停止任务。需先启用调度器(`SET GLOBAL event_scheduler = ON`),再创建事件(使用 `CREATE EVENT` 定义执行频率和操作)。推荐用 `TRUNCATE` 提高效率,注意权限与时区设置。为防数据丢失,可结合备份机制。到期后事件自动禁用,建议定期清理。
578 4
|
存储 关系型数据库 MySQL
【YashanDB知识库】MySQL返回结果集的存储过程的改写方法
本文介绍了将MySQL存储过程改写至YashanDB的解决方案。由于MySQL存储过程可直接返回结果集,而YashanDB需通过返回SYS_REF_CURSOR的函数实现类似功能,因此需要对代码进行转换。示例中展示了如何将MySQL存储过程`proc1`改写为YashanDB函数,并调整JDBC应用代码以适配REF_CURSOR输出参数,从而正确获取查询结果。此方法确保了跨数据库场景下的兼容性与功能性。
|
SQL 关系型数据库 MySQL
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
232 1
|
存储 SQL NoSQL
|
存储 关系型数据库 MySQL
MySQL 存储过程返回更新前记录
MySQL 存储过程返回更新前记录
286 3
|
存储 SQL 关系型数据库
MySQL 存储过程错误信息不打印在控制台
MySQL 存储过程错误信息不打印在控制台
362 1

推荐镜像

更多