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开发工程师的…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...
