在MySQL中,可以使用 UPDATE 语句来修改、更新一个或多个表的数据。 下面本篇文章带大家探究下MySQL中 UPDATE 的使用细节,希望对大家有所帮助。
需求背景
最近接到一个数据迁移的需求,旧系统的数据迁移到新系统;旧系统不会再新增业务数据,业务操作都在新系统上进行
为了降低迁移的影响,数据进行分批迁移,也就是说新旧系统会并行一段时间
数据分批不是根据 id 范围来分的,也就说每批数据的 id 都是无规律的
另外,为了保证新旧系统数据的对应,新系统的 id 尽可能的沿用旧系统的 id
因为表 id 在新旧系统都是自增的,所以迁移的时候,旧系统的 id 可能在新系统已经被占用了,类似如下
需求描述
数据迁移的时候,尽可能沿用旧系统的 id,而冲突的 id 需要进行批量调整
如何调整这批冲突的 id,正是我当下要实现的需求
我的实现是根据业务数据的增长情况,结合目前新系统的最大 id 来预设一个起始的 id
这个 SQL 该如何写?
需求实现
有小伙伴可能觉得,这还不简单?
不就 5 条数据嘛,这么写不就搞定了
多简单的事,还铺垫那么多,楼主你到底会不会?
楼主此刻幡然醒悟:小伙伴,你好厉害哇哦
但是如果冲突的数据很多了(几百上千),你也这样一条一条改?
如果你真这样做,我是真心佩服你
很显然,理智的小伙伴更多
那该如何实现了?
楼主就不卖关子了,可以用局部变量 + UPDATE 来实现,直接上 SQL
我们来看实际案例
表 tbl_batch_update
数据如下
执行效果如下
更新之后
更严谨点
该如何实现? UPDATE 是不是也支持 ORDER BY ?
还真支持,如下所示
楼主平时使用 UPDATE 的时候,基本没结合 ORDER BY ,也没尝试过结合 LIMIT
这次尝试让楼主对 UPDATE 产生了陌生的感觉,它的完整语法应该是怎样的?我们慢慢往下看
UPDATE
下文都是基于 MySQL 8.0 的官方文档 UPDATE Statement 整理而来,推荐大家直接去看官方文档
单表语法
是不是有很多疑问:
多表语法
相比于单表,貌似更简单一些,不支持 ORDER BY 和 LIMIT
LOW_PRIORITY
UPDATE 的修饰符之一,用来降低 SQL 的优先级
当使用 LOW_PRIORITY 之后, UPDATE 的执行将会被延迟,直到没有其他客户端从表中读取数据为止
但是,只有表级锁的存储引擎才支持 LOW_PRIORITY ,表级锁的存储引擎包括: MyISAM 、 MEMORY 和 MERGE ,所以最常用的 InnoDB 是不支持的
使用场景很少,混个眼熟就好
IGNORE
UPDATE 的修饰符之一,用来声明 SQL 执行时发生错误的处理方式
如果没有使用 IGNORE , UPDATE 执行时如果发生错误会中止,如下所示
9002 更新成 9003 的时候,主键冲突,整个 UPDATE 中止, 9000 更新成的 9001 会回滚, 9003 ~ 9005 还未执行更新
如果使用 IGNORE ,会是什么情况了?
UPDATE 执行期间即使发生错误了,也会执行完成,最终返回受影响的行数
上述返回受影响的行是 2 ,你们说说是哪两行修改了?
更多关于 IGNORE 的信息,请查看:The Effect of IGNORE on Statement Execution
关于使用场景,在新旧系统并行,做数据迁移的时候可能会用到,主键或者唯一键冲突的时候直接忽略
ORDER BY
如果大家对 UDPATE 的执行流程了解的话,那就更好理解了
UPDATE 其实有两个阶段: 查阶段 、 更新阶段
一行一行的处理,查到一行满足 WHERE 子句,就更新一行
所以,这里的 ORDER BY 就和 SELECT 中的 ORDER BY 是一样的效果
关于使用场景,大家可以回过头去看看前面讲到的的需求背景,
IGNORE 的案例 1 中的报错,其实也可以用 ORDER BY
LIMIT
LIMIT row_count 子句是行匹配限制。一旦找到满足 WHERE 子句的 row_count 行,无论这些行是否实际更改,该语句都会立即停止
也是就说 LIMIT 限制的是 查阶段 ,与 更新阶段 没有关系
注意:与 SELECT 语法中的 LIMIT
还是有区别的
value DEFAULT
UPDATE 中 SET 子句的 value 是表达式,我们可以理解,这个 DEFAULT 是什么意思?
我们先来看这么一个问题,假设某列被声明了 NOT NULL ,然而我们更新这列成 NULL
会发生什么
我们看下 SQL_MODE ,执行 SELECT @@sql_mode; 得到结果
STRICT_TRANS_TABLES 表明启动了严格模式,对 INSERT 和 UPDATE 语句的 value 管控会更严格
如果我们关闭严格模式,再看看执行结果
name 字段声明成了 NOT NULL ,非严格 SQL 模式下,将 name 设置成 NULL 是成功的,但更改的值并非 NULL ,而是 VARCHAR 类型的默认值: 空字符串('')
小结下
1、严格 SQL 模式下,对 NOT NULL 的字段设置 NULL ,会直接报错,更新失败
2、非严格 SQL 模式下,对 NOT NULL 的字段设置 NULL ,会将字段值设置字段类型对应的默认值
关于字段类型的默认值,可查看:Data Type Default Values
关于 sql_mode ,可查看:Server SQL Modes
通常情况下,生成环境的 MySQL 一般都是严格模式,所以大家知道有 value DEFAULT 这回事就够了
SET 字段顺序
针对如下 SQL
想必大家都很清楚
然而,以下 SQL 中的 name 列的值会是多少
我们来看下结果
name 的值是不是和预想的有点不一样?
单表 UPDATE 的 SET 是从左往右进行的,然而多表 UPDATE 却不是,多表 UPDATE 不能保证按任何特定顺序进行
总结
1、不管是 UPDATE ,还是 DELETE ,都有一个先查的过程,查到一行处理一行
2、 UPDATE 语法中的 LOW_PRIORITY 很少用, IGNORE 偶尔用, ORDER BY 和 LIMIT 相对会用的多一点,都混个眼熟
3、 sql_mode 是比较重要的知识点,推荐大家掌握;生产环境,强烈推荐开启严格模式
原文地址:https://www.cnblogs.com/youzhibing/p/16719474.html
作者:青石路
【相关推荐:mysql视频教程】
以上是深入探究MySQL中 UPDATE 的使用细节的详细内容。更多信息请关注PHP中文网其他相关文章!

在数据库优化中,应根据查询需求选择索引策略:1.当查询涉及多个列且条件顺序固定时,使用复合索引;2.当查询涉及多个列但条件顺序不固定时,使用多个单列索引。复合索引适用于优化多列查询,单列索引则适合单列查询。

要优化MySQL慢查询,需使用slowquerylog和performance_schema:1.启用slowquerylog并设置阈值,记录慢查询;2.利用performance_schema分析查询执行细节,找出性能瓶颈并优化。

MySQL和SQL是开发者必备技能。1.MySQL是开源的关系型数据库管理系统,SQL是用于管理和操作数据库的标准语言。2.MySQL通过高效的数据存储和检索功能支持多种存储引擎,SQL通过简单语句完成复杂数据操作。3.使用示例包括基本查询和高级查询,如按条件过滤和排序。4.常见错误包括语法错误和性能问题,可通过检查SQL语句和使用EXPLAIN命令优化。5.性能优化技巧包括使用索引、避免全表扫描、优化JOIN操作和提升代码可读性。

MySQL异步主从复制通过binlog实现数据同步,提升读性能和高可用性。1)主服务器记录变更到binlog;2)从服务器通过I/O线程读取binlog;3)从服务器的SQL线程应用binlog同步数据。

MySQL是一个开源的关系型数据库管理系统。1)创建数据库和表:使用CREATEDATABASE和CREATETABLE命令。2)基本操作:INSERT、UPDATE、DELETE和SELECT。3)高级操作:JOIN、子查询和事务处理。4)调试技巧:检查语法、数据类型和权限。5)优化建议:使用索引、避免SELECT*和使用事务。

MySQL的安装和基本操作包括:1.下载并安装MySQL,设置根用户密码;2.使用SQL命令创建数据库和表,如CREATEDATABASE和CREATETABLE;3.执行CRUD操作,使用INSERT,SELECT,UPDATE,DELETE命令;4.创建索引和存储过程以优化性能和实现复杂逻辑。通过这些步骤,你可以从零开始构建和管理MySQL数据库。

InnoDBBufferPool通过将数据和索引页加载到内存中来提升MySQL数据库的性能。1)数据页加载到BufferPool中,减少磁盘I/O。2)脏页被标记并定期刷新到磁盘。3)LRU算法管理数据页淘汰。4)预读机制提前加载可能需要的数据页。

MySQL适合初学者使用,因为它安装简单、功能强大且易于管理数据。1.安装和配置简单,适用于多种操作系统。2.支持基本操作如创建数据库和表、插入、查询、更新和删除数据。3.提供高级功能如JOIN操作和子查询。4.可以通过索引、查询优化和分表分区来提升性能。5.支持备份、恢复和安全措施,确保数据的安全和一致性。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

禅工作室 13.0.1
功能强大的PHP集成开发环境

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)