MySQL必知必会 | 存储过程、游标、触发器
使用存储过程
存储过程
简单来说就是为了以后的使用而保存的一条或多条MySQL语句的集合。
我觉得就是封装了一组sql语句
为什么需要存储过程(简单来说就是,简单、安全、高性能
- 通过把处理封装在容易使用的单元中,简化复杂操作
- 所有开发人员和应用程序都是用同一存储过i成,则使用的sql语句都是一样的,保证了数据的完整性(防止数据库中存在不正确的数据
- 简化对变动的管理,保证了数据库的安全性(防止数据库中存在不正确的数据
- 提高了性能
- 增加了代码功能的灵活性
执行存储过程
CALL procedure_name(参数);
创建存储过程
CREATE POCEDURE procedure_name()
BEGINSQL语句
END
MYSQL命令行客户机的分隔符
默认的MYSQL语句分割符为 ;
如果希望自定义分隔符,可以使用 DELIMITER
关键字
DELIMITER //
CREATE PROCEDURE procedure_name
BEGINSQL 语句
END //DELIMITER ;
存储过程实际上是一种函数,所以存储过程名后边需要有 ()
删除存储过程
存储过程在创建之后,被保存在服务器上以供使用,直到被删除
DROP PROCEDURE procedure_name;
注意,只需要给出存储过程名,不需要加 ()
使用参数
变量
内存中的一个特定的位置,用来临时存储数据
参数的数据类型
存储过程的参数允许的数据类型与表中使用的数据类型相同
变量名
MYSQL中所有变量都必须以@
开始
游标
为什么需要游标
MySQL检索操作,返回一组成为结果集的行,有时,需要在检索出来的行中前进或者后退几行,这就需要游标
游标的定义
游标是一个存储在MySQL服务器上的数据库查询,它是被语句查询出来的结果集
在存储了游标以后,应用程序可以根据需要滚动或浏览器中的数据
游标主要用于交互式应用,其中用户需要滚动屏幕上的数据,并对数据进行浏览或做出更改
使用游标
- 使用游标前,需要声明游标,这个过程实际上没有检索数据,只是定义要使用的
select
语句 - 声明游标以后,需要将它打开来使用,这个过程会使用上一步定义的
select
语句把数据实际检索出来 - 对于填有数据的游标,根据需要取出各行
- 在结束游标使用时,必须关闭游标
创建游标
CREATE PROCEDURE procedure_name
BEGINDECLARE vernier_name CURSORFORSELECT语句
END
打开和关闭游标
OPEN vernier_nameCLOSE vernier_name
在一个游标关闭后,如果没有重新打开,则不能使用他
但是,声明过的游标,关闭后不需要再次声明
隐含关闭,如果你不明确关闭游标,MySQL会在 END
语句使,自动关闭游标
使用游标数据
当一个游标被打开后,可以使用FETCH
来访问他的每一行
FETCH
指定检索什么数据,检索出来的数据存储在什么地方,还可以向前移动游标中的内部行指针,使下一条FETCH
语句检索下一行
DECLARE vernier_name CURSOR
FOR
SELECT语句OPEN vernier_nameDECLARE O INT
REPEATFETCH vernier_name INTO O
UNTIL condition END REPEATCLOSE vernier_name
DECLARE
语句的次序
局部变量 > 游标 > 句柄
触发器
为什么需要触发器
有时需要,某个表发生改动时,自动处理,这种情况下,就需要触发器
MySQL中可以触发触发器的语句
DELETE\INSERT\UPDATE
创建触发器
触发器需要在每个表中唯一命名,但不需要在每个数据库中唯一,即数据库中的两个表可具有相同名字的触发器
CREATE TRIGGER trigger_name AFTER/BEFORE operation ON table_name
FOR EACH ROW
只有表才支持触发器,视图不支持
触发器按每个表每个事件每次定义,每个表每个事件每次只允许一个触发器
每个表最多支持6个触发器(3种操作 * ( before || after ) = 6
单一触发器不能与多个事件或多个表关联
删除触发器
触发器的类型
- INSERT
- 在
INSERT
触发器代码内,可以引用一个名为NEW
的虚拟表,访问被插入的行, - 在
before insert
触发器中,new
的值也可以被更新, - 对于
auto_increment
列,new
在insert
执行前包含0,在INSERT
执行后包含新的自动生成值
- 在
- DELET
- 在
DELET
触发器代码内,可以引用一个名为OLD
的虚拟表,访问被删除的行 OLD
中的值全部都是只读的,不能更新
- 在
- UPDATE
- 在
UPDATE
触发器代码中,可以引用OLD
虚拟表访问UPDATE
前的值,引用NEW
虚拟表,访问新更新的值 - 在
BEFORE UPDATE
触发器中,NEW
中的值可能也被更新 OLD
中的值全部都是只读的,不能更新
- 在
触发器的使用要点
- 创建触发器可能需要特殊的安全访问权限
- 应该用触发器来保重数据的一致性
- 触发器的一种非常有意义的使用是创建审计和跟踪
- 触发器中不能调用存储过程
管理事务处理
COMMIT
&ROLLBACK
事务管理
并非所有的引擎都支持事务处理,MyISAM
不支持事务处理,InnoDB
支持事务处理
事务处理
用于维护数据库的完整性,保证成批的MySQL操作要么完全执行,要么完全不执行
事务:指一组SQL语句
回退:被撤销指定SQL语句的过程
提交:将未存储的SQL语句结果写入数据库
保留点:事务处理中设置的临时占位符,可以对他发布回退
控制事务处理
管理事务处理的关键在于,将SQL语句组分解为逻辑块,并明确规定数据和是应该回退,何时不应该回退
SELECT * FROM table_name;
START TRANSACTION;
DELETE FROM table_name;
SELECT * FROM table_name;
ROLLBACK;
SELECT * FROM order_name;
使用COMMIT
隐含提交:一般的MySQL语句都是直接针对数据库表执行和编写的,即提交操作是自动进行的
隐含事务关闭:当COOMIT
和ROLLBACK
语句执行后,是误会自动关闭
使用保留点
为了支持回退部分事务处理,可以在事务处理块中的合适位置防止占位符,如果需要回退,可以回退到某个占位符
保留点越多越好:可以在MySQL代码中设置任意多的保留点,保留点越多,你就越能按自己的意愿灵活的进行回退
释放保留点:保留点在事务处理完成后自动释放,也可以使用RELEASE SAVEPOINT
明确的释放保留点
更改默认的提交行为
SET autocommit=0;
autocommit
标志决定是否自动提交更改,不管有没有COMMIT
语句
autocommit
针对每个连接,而不是服务器
相关文章:
MySQL必知必会 | 存储过程、游标、触发器
使用存储过程 存储过程 简单来说就是为了以后的使用而保存的一条或多条MySQL语句的集合。 我觉得就是封装了一组sql语句 为什么需要存储过程(简单来说就是,简单、安全、高性能 通过把处理封装在容易使用的单元中,简化复杂操作所有开发人员…...

优化Facebook广告ROI的数据驱动方法:从投放到运营
“投放广告并不是最终的目的,关键在于如何最大程度地利用数据驱动的方法来提高广告投放的回报率(ROI)”Facebook广告是现代数字营销中最为常见和重要的广告形式之一。但是,要让Facebook广告真正发挥作用,需要通过数据驱…...

动态规划入门经典问题讲解
最近开始接触动态规划问题,以下浅谈(或回顾)一下这些问题的求解过程。解题思路对于动态规划问题,由于最终问题的求解需要以同类子问题作为基础,故需要定义一个dp数组(一维或二维)来记录问题求解…...

快速入门深度学习1(用时1h)
速通《动手学深度学习》1写在最前面0.内容与结构1.深度学习简介1.1 问题引入1.2 思路:逆向思考1.3 跳过1.4 特点1.5 小结2.预备知识(MXNet版本,学错了。。。。)2.1 获取和运行本书的代码2.2 数据操作2.2.1 略过2.2.2 小结2.3 自动…...

PaddleOCR关键信息抽取(KIE)的训练(SER训练和RE训练)错误汇总
1.SER训练报错: SystemError: (Fatal) Blocking queue is killed because the data reader raises an exception 1.1.问题描述 在执行训练任务的时候报错 单卡训练 python3 tools/train.py -c train_data/my_data/ser_vi_layoutxlm_xfund_zh.yml错误信息如下: T…...

信息收集之搜索引擎
Google Hacking 也可以用百度,不过谷歌的搜索引擎更强大 site 功能:搜索指定域名的网页内容,可以用来搜索子域名、跟此域名相关的内容 示例: site:zhihu.com 搜索跟zhihu.com相关的网页“web安全” site:zhihu.com 搜索zhihu…...
Flutter(四)布局类组件
目录布局类组件简介布局原理与约束线性布局(Row和Column)弹性布局流式布局(Wrap、Flow)层叠布局(Stack、Positioned)对齐与相对定位(Align)Align和Stack对比Center组件LayoutBuilder…...

【黑马】Java基础从入门到起飞目录合集
视频链接: Java入门到起飞(上部):BV17F411T7AoJava入门到起飞(下部):BV1yW4y1Y7Ms 学习时间: 2023/02/01 —— 2023/03/09断断续续的学习,历时大概37天,完结撒…...
PMP考前冲刺3.10 | 2023新征程,一举拿证
题目1-2:1.在最近的一次耗时四周的迭代中,赫克托尔所在的敏捷团队刚完成了10 个用户故事点的开发、测试和发布,那么团队的速度是?A. 10B. 4C. 5D.402.产品负责人奥佩,倾向于在短周期内看到工作产品的新版本,…...
JavaScript Math常用方法
math是JavaScript的一个内置对象,它提供了一些数学属性和方法,可以对数字进行计算(用于Number类型)。 math和其他全局对象不同,它不是一个构造器,math的所有方法和属性都是静态的,直接使用并传入…...

【C++】模板进阶
文章目录一、非类型模板参数1、非类型模板参数2、C11 中的 array 类二、模板的特化1、模板特化的概念2、函数模板特化3、类模板特化3.1 全特化3.2 偏特化三、模板的分离编译四、模板总结一、非类型模板参数 1、非类型模板参数 模板参数分为类型形参与非类型形参,类…...

三板斧解决leetcode的链表题
在《波奇学单链表》中我们提到单链表的两个特点单向性。头节点尾节点的特殊性导致分类讨论的情况。如何看单链表?让我们简化成下图cur表示当前节点,下图表示cur移动,圆圈表示值用哨兵卫节点(新的头节点)和把尾节点看成NULL来把头尾节点一般化…...

全生命周期的云原生安全框架
本博客地址:https://security.blog.csdn.net/article/details/129423036 一、全生命周期的云原生安全框架 如图所示: 二、框架说明 在上图中,我们从两个维度描述各个安全机制,横轴是开发和运营阶段,细分为编码、测试…...

【本地网站上线】ubuntu搭建web站点,并内网穿透发布公网访问
【本地网站上线】ubuntu搭建web站点,并内网穿透发布公网访问前言1. 本地环境服务搭建2. 局域网测试访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问4. 配置固定二级子域名4.1 保留一个二级子域名4.2 配置二级子域名4.3 测试访问公网固定二级子…...

电脑怎么重装系统?教你轻松掌握这些方法
重新安装计算机系统有两种原因:一种是计算机系统可以正常使用,但是电脑比较卡,为了提高它的运行速度,所以想要通过重新安装系统来解决这个问题;另一种原因是计算机系统文件丢失,系统出现蓝屏,或者黑屏的情况…...

leetcode-每日一题-2379(简单,字符串)
久违的简单题......给你一个长度为 n 下标从 0 开始的字符串 blocks ,blocks[i] 要么是 W 要么是 B ,表示第 i 块的颜色。字符 W 和 B 分别表示白色和黑色。给你一个整数 k ,表示想要 连续 黑色块的数目。每一次操作中,你可以选择…...
SLF4J日志框架在项目中使用
介绍 SLF4J全称“Simple Logging Facade for Java”,作为各种日志框架的简单门面。例如: java.util.logging、logback 、 reload4j等。只需要切换日志框架的jar包依赖就可以切换日志框架。 SLF4J支持的日志框架包含如下: log4j:…...

Spark MLlib 模型训练
Spark MLlib 模型训练决策树随机森林GBDTSpark MLlib 开发框架下 : 监督学习 : 回归 (Regression) , 分类 (Classification) , 协同过滤 (Collaborative Filtering)非监督学习 : 聚类 (Clustering) 、频繁项集 (Frequency Patterns) 例子分类 : 算法分类 : 算法分类算法子分类…...

Python中变量的作用域精讲
文章目录前言一、局部变量二、全局变量前言 变量的作用域是指程序代码能够访问该变量的区域,如果超出该区域,再访问时就会出现错误。在程序中,一般会根据变量的 “有效范围” 将变量分为 “全局变量” 和 “局部变量”。 一、局部变量 局部变…...
数据仓库工程师的工作职责的相关介绍
1. BI 开发工程师的工作内容是什么? BI开发工程师(Business Intelligence Developer)是负责设计和开发企业级BI系统的专业人员。他们的主要工作是从多个数据源中提取、转换、加载和分析数据,以支持企业决策。以下是BI开发工程师的…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...

R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...