MySQL补充知识点学习
书接上文:MySQL关系型数据库学习,继续看书补充MySQL知识点学习。
1. 基本概念学习
1.1 游标(Cursor)
MySQL 游标是一种数据库对象,它允许应用程序逐行处理查询结果集,而不是一次性获取所有结果。游标在需要逐行处理数据或执行复杂业务逻辑时非常有用。
游标的主要作用和功能
- 逐行处理查询结果
- 游标允许应用程序按需获取查询结果的每一行,而不是一次性加载所有数据
- 特别适合处理大量数据时避免内存溢出
- 支持复杂的业务逻辑处理
- 允许在结果集上执行复杂的业务逻辑,如条件判断、计算、更新等
- 可以在处理每一行时执行不同的操作
- 实现逐行更新或删除
- 可以结合游标对查询结果中的每一行执行更新或删除操作
- 这在需要基于当前行内容决定如何处理下一行时非常有用
- 支持存储过程中的流程控制
- 在存储过程中使用游标可以实现更复杂的流程控制
- 可以结合条件判断、循环等语句实现复杂的业务逻辑
- 提供灵活的数据访问方式
- 允许应用程序以编程方式控制数据的访问和处理
- 可以暂停、继续或重新开始数据处理
游标的基本使用步骤
在MySQL中,游标通常与存储过程一起使用,基本使用步骤如下:
1. 声明游标:定义要处理的查询
2. 打开游标:执行查询并准备结果集
3. 获取数据:逐行获取结果集中的数据
4. 处理数据:对每一行执行所需的操作
5. 关闭游标:释放游标资源
游标使用的具体示例
示例1:基本游标使用
DELIMITER //CREATE PROCEDURE process_employees()
BEGIN-- 1. 声明游标DECLARE emp_cursor CURSOR FOR SELECT id, name, salary FROM employees;-- 2. 声明异常处理变量DECLARE done INT DEFAULT FALSE;DECLARE emp_id INT;DECLARE emp_name VARCHAR(100);DECLARE emp_salary DECIMAL(10,2);-- 3. 声明异常处理程序DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;-- 4. 打开游标OPEN emp_cursor;-- 5. 循环获取数据read_loop: LOOPFETCH emp_cursor INTO emp_id, emp_name, emp_salary;IF done THENLEAVE read_loop;END IF;-- 6. 处理数据(这里只是打印,实际可以执行其他操作)-- 注意:MySQL存储过程中不能直接打印,这里只是示意-- 实际应用中可以执行更新、插入等操作-- SELECT CONCAT('Processing employee: ', emp_name) AS message;END LOOP;-- 7. 关闭游标CLOSE emp_cursor;
END //DELIMITER ;-- 调用存储过程
CALL process_employees();
示例2:结合条件判断和更新
DELIMITER //CREATE PROCEDURE update_salaries()
BEGIN-- 1. 声明游标DECLARE emp_cursor CURSOR FOR SELECT id, name, salary FROM employees WHERE status = 'active';-- 2. 声明异常处理变量DECLARE done INT DEFAULT FALSE;DECLARE emp_id INT;DECLARE emp_name VARCHAR(100);DECLARE emp_salary DECIMAL(10,2);-- 3. 声明异常处理程序DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;-- 4. 打开游标OPEN emp_cursor;-- 5. 循环获取数据read_loop: LOOPFETCH emp_cursor INTO emp_id, emp_name, emp_salary;IF done THENLEAVE read_loop;END IF;-- 6. 处理数据:如果工资低于5000,则增加10%IF emp_salary < 5000 THENUPDATE employees SET salary = salary * 1.1 WHERE id = emp_id;END IF;END LOOP;-- 7. 关闭游标CLOSE emp_cursor;
END //DELIMITER ;-- 调用存储过程
CALL update_salaries();
游标的特点和限制
特点:
1.逐行处理:可以逐行访问查询结果
2.灵活控制:可以控制数据处理的流程和逻辑
3.支持复杂逻辑:可以在处理每一行时执行复杂的业务逻辑
4.与存储过程结合:通常与存储过程一起使用
限制:
1.性能开销:游标会带来额外的性能开销,特别是在处理大量数据时
2.内存使用:虽然比一次性加载所有数据更节省内存,但仍会占用资源
3.只能用于存储过程:MySQL中的游标只能在存储过程中使用
4.不能直接用于应用程序:应用程序不能直接使用MySQL游标,必须通过存储过程间接使用
5.锁定问题:游标可能会锁定查询结果集中的行,影响并发性能
游标的适用场景
1.需要逐行处理大量数据:当数据量很大,一次性加载所有数据会导致内存问题时
2.需要基于当前行内容决定如何处理下一行:如复杂的业务逻辑处理
3.需要执行逐行更新或删除:根据当前行的内容决定如何处理其他行
4.需要实现复杂的流程控制:在存储过程中需要复杂的条件判断和循环
5.需要与外部系统交互:如逐行读取数据并发送到外部系统进行处理
游标与批量处理的比较
最佳实践
1.仅在必要时使用游标:优先考虑批量处理,只有在确实需要逐行处理时才使用游标
2.优化游标查询:确保游标使用的查询是高效的
3.限制游标处理的数据量:只处理必要的数据,避免不必要的数据处理
4.考虑替代方案:对于简单的批量操作,考虑使用批量更新或删除语句
5.测试性能:在生产环境使用前测试游标的性能影响
6.及时关闭游标:确保在不再需要时关闭游标,释放资源
MySQL游标是一个强大的工具,但应该谨慎使用,因为它会带来性能开销。在大多数情况下,批量处理是更好的选择,只有在确实需要逐行处理复杂逻辑时才使用游标。
1.2 事务(transaction)
将多个操作作为一个整体来处理的功能称为“事务”(transaction)。将开启事务之后的处理结果反馈到数据库的操作称为“提交”(commit),不反映到数据库中而恢复成原来的状态的操作称为“回滚”。
自动提交
默认情况下,也就是不手动开启事务时,MySQL的处理都是直接被提交的。也就是说,所有的操作都会自动执行commit;语句。这种功能被称为“自动提交”(auto commit)。
使用范围
下面这些操作是无法还原的,小伙伴们一定要记住。
- drop database
- drop table
- drop view
- alter table
事务的属性
事务有很严格的定义,必须同时满足4个属性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。这4个属性通常又被简称为“ACID”特性。
- 原子性:事务作为一个整体来执行,所有操作要么都执行,要么都不执行;
- 一致性:事务应确保数据库从一个一致状态转变为另一个一致状态;
- 隔离性:当多个事务并发执行时,一个事务的执行不影响其他事务的执行;
- 持久性:事务一旦提交,它对数据库的修改应该永久保存在数据库中;
1.3 表的设计原则
介绍一些常用的小技巧,以设计出更好的表,主要包括以下5个方面。
- 对于一个表的主键,我们一般是使用自动递增的值,而不是手动插入值;
- 如果一个字段只有两种取值,比如“男”或“女”、“是”或“否”,比较好的做法是使用tinyint(1)类型,而不是使用varchar等类型。当然,使用varchar等类型也是没有问题的。
- 如果想要保存图片,我们一般不会将图片保存到数据库中,这样会占用大量的空间。一般是将图片上传到服务器,数据库中保存的则是图片的地址(URL)。
- 对于一篇文章,数据库一般保存的是包含该文章的HTML代码,也叫作“富文本”。一般我们会使用富文本编辑器编辑内容,然后获取对应的HTML代码,而将该HTML代码保存到数据库中。
- 设计表时,应该给所有的表和字段添加对应的注释。这个好习惯一定要养成,这样可以使后期的维护工作更加轻松、简单。
1.4 mysql软删除是什么
MySQL 软删除(Soft Delete)详解
软删除是一种数据管理策略,它不是真正从数据库中物理删除记录,而是通过标记记录为"已删除"状态来保留数据。这与硬删除(直接从数据库中移除记录)形成对比。
为什么使用软删除?
数据恢复:可以轻松恢复误删的数据
审计追踪:保留完整的历史记录用于审计或分析
外键约束:避免因删除记录而破坏外键关系
数据分析:可以分析被删除的数据模式
如何实现软删除
添加"删除标记"列
最常见的方法是添加一个布尔类型的列(如is_deleted)或时间戳列(如deleted_at):
ALTER TABLE your_table ADD COLUMN is_deleted TINYINT(1) DEFAULT 0;
– 或者
ALTER TABLE your_table ADD COLUMN deleted_at DATETIME NULL;
更新查询逻辑
在所有查询中需要排除已删除的记录:
– 使用 is_deleted 列
SELECT * FROM your_table WHERE is_deleted = 0;
– 使用 deleted_at 列
SELECT * FROM your_table WHERE deleted_at IS NULL;
实现删除操作
更新记录而不是删除:
– 使用 is_deleted 列
UPDATE your_table SET is_deleted = 1 WHERE id = 123;
– 使用 deleted_at 列
UPDATE your_table SET deleted_at = NOW() WHERE id = 123;
恢复已删除的记录
– 使用 is_deleted 列
UPDATE your_table SET is_deleted = 0 WHERE id = 123;
– 使用 deleted_at 列
UPDATE your_table SET deleted_at = NULL WHERE id = 123;
高级实现方式
使用触发器自动处理
可以创建触发器在删除操作时自动更新标记:
CREATE TRIGGER before_delete_trigger
BEFORE DELETE ON your_table
FOR EACH ROW
BEGINUPDATE your_table SET is_deleted = 1, deleted_at = NOW() WHERE id = OLD.id;-- 取消实际的删除操作SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Use soft delete instead';
END;
不过这种方法不太推荐,因为它会干扰正常的DELETE操作流程。
使用视图过滤已删除记录
创建一个只显示未删除记录的视图:
CREATE VIEW active_records AS
SELECT * FROM your_table WHERE is_deleted = 0;
-- 或者
CREATE VIEW active_records AS
SELECT * FROM your_table WHERE deleted_at IS NULL;
然后应用程序可以查询这个视图而不是原始表。
使用数据库扩展或ORM功能
许多ORM框架(如Laravel的Eloquent、Django ORM等)内置了软删除支持:
Laravel Eloquent:
// 模型中添加use SoftDeletes;// 查询时会自动排除已删除记录$records = Model::all();// 恢复记录$record->restore();
Django:
from django.db import modelsclass MyModel(models.Model):# ...is_deleted = models.BooleanField(default=False)class Meta:abstract = Truedef delete(self, using=None, keep_parents=False):self.is_deleted = Trueself.save()
注意事项
索引优化:为is_deleted或deleted_at列添加索引以提高查询性能
备份策略:虽然数据未被物理删除,但仍需定期备份
存储空间:长期积累的"已删除"数据会占用存储空间,可能需要定期归档
查询习惯:开发人员需要养成总是排除已删除记录的习惯
软删除是一种简单有效的数据管理策略,特别适合需要保留历史记录或允许数据恢复的场景。
相关文章:

MySQL补充知识点学习
书接上文:MySQL关系型数据库学习,继续看书补充MySQL知识点学习。 1. 基本概念学习 1.1 游标(Cursor) MySQL 游标是一种数据库对象,它允许应用程序逐行处理查询结果集,而不是一次性获取所有结果。游标在需…...
《前端面试题:CSS有哪些单位!》
CSS单位大全:从像素到容器单位的前端度量指南 精通CSS单位是构建响应式、灵活布局的关键技能,也是面试中的必考知识点 一、CSS单位的重要性与分类 在网页设计中,CSS单位是控制元素尺寸、间距和定位的基础。不同的单位提供了不同的计算方式和…...

[ctfshow web入门] web80
信息收集 过滤了php和data if(isset($_GET[file])){$file $_GET[file];$file str_replace("php", "???", $file);$file str_replace("data", "???", $file);include($file); }else{highlight_file(__FILE__); }解题 大小写…...

【设计模式-4.5】行为型——迭代器模式
说明:本文介绍设计模式中,行为型设计模式之一的迭代器模式。 定义 迭代器模式(Iterator Pattern),也叫作游标模式(Cursor Pattern),它提供一种按顺序访问集合/容器对象元素的方法&…...

C++_核心编程_继承中的对象模型
继承中的对象模型 **问题:**从父类继承过来的成员,哪些属于子类对象中? * 结论: 父类中私有成员也是被子类继承下去了,只是由编译器给隐藏后访问不到 */ class Base { public:int m_A; protected:int m_B; private:int…...

使用cephadm离线部署reef 18版并配置对接openstack
源 curl --silent --remote-name --location https://download.ceph.com/rpm-squid/el9/noarch/cephadm chmod x cephadm./cephadm add-repo --release reef监视节点 离线下载 apt-get --download-only install ceph ceph-mon ceph-mgr ceph-commonmkdir /reef/mon mv /var/…...
Redis最佳实践——性能优化技巧之缓存预热与淘汰策略
Redis在电商应用中的缓存预热与淘汰策略优化 一、缓存预热核心策略 1. 预热数据识别方法 热点数据发现矩阵: 维度数据特征发现方法历史访问频率日访问量>10万次分析Nginx日志,使用ELK统计时间敏感性秒杀商品、新品上线运营数据同步关联数据购物车关…...

2024年数维杯国际大学生数学建模挑战赛D题城市弹性与可持续发展能力评价解题全过程论文及程序
2024年数维杯国际大学生数学建模挑战赛 D题 城市弹性与可持续发展能力评价 原题再现: 中国人口老龄化趋势的加剧和2022年首次出现人口负增长,表明未来一段较长时期内我国人口将呈现下降趋势。这一趋势必将影响许多城市的高质量和可持续发展,…...
3D Gaussian splatting 06: 代码阅读-训练参数
目录 3D Gaussian splatting 01: 环境搭建3D Gaussian splatting 02: 快速评估3D Gaussian splatting 03: 用户数据训练和结果查看3D Gaussian splatting 04: 代码阅读-提取相机位姿和稀疏点云3D Gaussian splatting 05: 代码阅读-训练整体流程3D Gaussian splatting 06: 代码…...

QT聊天项目DAY13
1. 重置密码 重置密码label也要实现浮动和点击效果,所以将忘记密码这个标签提升为ClickedLabel 1.1 ClickedLabel的复用 由于样式表(.qss) 文件中可以写入多个控件的状态UI,所以为了ClickedLabel能够复用,将成员变量的初始化方式修改为函数…...

Web3如何重塑数据隐私的未来
在这个信息爆炸的时代,数据隐私已成为我们不得不面对的严峻问题。Web3,作为下一代互联网的代表,以其去中心化、用户主权和数据安全等特点,正在重塑数据隐私的未来。它不仅仅是技术的革新,更是对个人隐私保护理念的一次…...

【鸿蒙】HarmonyOS NEXT之如何正常加载地图组件
1、不支持模拟器,需要真机! 2、Map地图需要在AGC上申请权限,需要在AGC上创建对应的项目 地址: AppGallery Connect 2.1 AGC中项目创建 2.1.1 添加项目 2.1.2 起个名字 2.1.3 添加应用: 2.1.4 选择HarmonyOS APP&…...

前端框架进化史
本内容是对 You’ll Never Manually Update the DOM Again // Here’s Why 内容的翻译与整理。 你再也不需要手工更新DOM, 以下是原因 现代 JavaScript 框架,如 React、Vue、Svelte、Solid、Quick,以及本周推出的其他 786 个框架,都试图做一些…...
“轻量应用服务器” vs. “云服务器CVM”:小白入门腾讯云,哪款“云机”更适合你?(场景、配置、价格对比解析)
更多云服务器知识,尽在hostol.com 当你第一次踏入腾讯云这个“数字百货大楼”,面对琳琅满目的“云产品”,是不是有点眼花缭乱,特别是看到“轻量应用服务器”和“云服务器CVM”这两位都号称能帮你“安家落户”的“云主机”时&…...
day63—回溯—全排列(LeetCode-46)
题目描述 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1: 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2: 输入&#x…...

(二)stm32使用4g模块(移远ec800k)连接mqtt
下面代码是随手写的,没有严谨测试仅供参考测试 uint8_t msgBuf[200]{"msg from mcu"}; uint8_t txBuf[250]{0}; uint16_t msgid0; uint16_t mqttTaskState0; uint16_t t100msCount0; uint8_t sendFlag10; uint8_t sendFlag20; void t100msTask1(void) { …...

防火墙iptables项目实战
目录 一、网络规划 三、环境准备与检测 1、firewall (1)配置防火墙各大网卡ip并禁用firewalld和selinux (2)打开firewall路由转发 2、PC1(内网) (1)配置ip并禁用firewalld和s…...

webpack继续学习
认识PostCSS工具 PostCSS是一个通过JS来转换样式的工具,这个工具可以帮助我们进行一些CSS的转换和适配,比如自动添加浏览器前缀,css样式的重置 实现这些功能需要借助于PostCSS对应的插件 自动添加浏览器前缀需要: npm install…...

Scrapy爬虫框架Spiders爬虫脚本使用技巧
我们都知道Scrapy是一个用于爬取网站数据、提取结构化数据的Python框架。在Scrapy中,Spiders是用户自定义的类,用于定义如何爬取某个(或某些)网站,包括如何执行爬取(即跟踪链接)以及如何从页面中…...

PowerBI企业运营分析—全动态盈亏平衡分析
PowerBI企业运营分析—全动态盈亏平衡分析 欢迎来到Powerbi小课堂,在竞争激烈的市场环境中,企业运营分析平台成为提升竞争力的核心工具。 该平台通过整合多源数据,实现关键指标的实时监控,从而迅速洞察业务动态,精准…...

docker的基本命令
容器的三大组成 镜像image 一个静态文件,特点:分层结构,不可更改 容器container 镜像运行的结果,容器可以修改,运行完后直接停止 仓库registry 用来存放镜像文件的地方 容器的常用命令介绍 关于镜像的命令 docker …...

【运维实战】Rsync将一台主Web服务器上的文件和目录同步到另一台备份服务器!
在管理 Web 服务器时,确保数据安全且在发生故障时能够快速恢复至关重要,备份和镜像 Web 服务器数据最可靠的方法之一是使用 rsync。 Rsync 工具可以帮助在两台服务器之间同步文件和目录,非常适合用于创建 Web 服务器数据的备份和镜像。 下面…...
实时通信RTC与传统直播的异同
实时通信(RTC)与直播虽然在音视频传输领域密切相关,但设计目标和实现原理是存在显著差异的。 一、核心联系 共同目标:均需实现音视频数据的采集、编码、传输与播放。技术重叠:使用相似的编码标准(如H.264/…...
Python-正则表达式(re 模块)
目录 一、re 模块的使用过程二、正则表达式的字符匹配1. 匹配开头结尾2. 匹配单个字符3. 匹配多个字符4. 匹配分组5. Python 代码示例 三、re 模块的函数1. 函数一览表2. Python 代码示例1)search 与 finditer2)findall3)sub4)spl…...

AgenticSeek 本地部署教程(Windows 系统)
#工作记录 Fosowl/agenticSeek:完全本地的 Manus AI。 部署排错参考资料在文末 或查找往期笔记。 AgenticSeek 本地部署教程(Windows 系统) 一、环境准备 1. 安装必备工具 Docker Desktop 下载地址:Docker Desktop 官网 安装后启…...

基于 qiankun + vite + vue3 构建微前端应用实践
核心内容摘要 技术栈组合 采用 Vite Vue3 Qiankun 构建微前端架构主应用和子应用独立开发部署,通过 Qiankun 集成 2. 主应用关键配置通过 registerMicroApps 注册子应用,配置路由匹配规则(activeRule)使用…...
VR教育:开启教育新时代的钥匙
VR 教育,即虚拟现实教育,是将虚拟现实技术(Virtual Reality,简称 VR)应用于教育领域的一种创新教育模式。它借助计算机技术、图形图像技术、传感器技术等,创建出高度逼真的虚拟学习环境,让学生通过头戴式显示设备、手柄…...

机器学习:逻辑回归与混淆矩阵
本文目录: 一、逻辑回归Logistic Regression二、混淆矩阵(一)精确率precision(二)召回率recall(三)F1-score:了解评估方向的综合预测能力(四)Roc曲线…...

20250602在荣品的PRO-RK3566开发板的Android13下打开HDMI显示
20250602在荣品的PRO-RK3566开发板的Android13下打开HDMI显示 2025/6/2 16:20 缘起:貌似荣品的PRO-RK3566开发板的Android13默认关闭了HDMI显示。 据说:荣品确认RK3566的GPU比较弱,同时开【MIPI接口的】LCD屏显示和HDMI显示容易出现异常。 更…...
【学习记录】快速上手 PyQt6:设置 Qt Designer、PyUIC 和 PyRCC 在 PyCharm中的应用
文章目录 📌 前言✅ 第一步:安装 PyQt6 及其工具包🔧 第二步:找到相关工具路径🧰 第三步:在 PyCharm 中配置外部工具打开设置🛠️ 配置 Qt Designer🛠️ 配置 PyUIC6(UI转…...