mysqlupdate原理(MySQL UPDATE 语句的非标准实现代码)
类别:数据库 浏览量:2288
时间:2021-10-13 00:33:06 mysqlupdate原理
MySQL UPDATE 语句的非标准实现代码今天给大家介绍一下 MySQL 数据库中 UPDATE 语句和 SQL 标准(以及其他数据库)实现上的一个差异。如果我们没有注意到这个问题,很可能会导致意料之外的结果。
我们首先创建一个简单的示例表:
|
CREATE TABLE t1( id int , col1 int , col2 int ); INSERT INTO t1 VALUES (1, 1, 1); SELECT * FROM t1; id|col1|col2| --|----|----| 1| 1| 1| ———————————————— 版权声明:本文为CSDN博主「不剪发的Tony老师」的原创文章,遵循CC 4.0 BY -SA版权协议,转载请附上原文出处链接及本声明。 CREATE TABLE t1( id int , col1 int , col2 int ); INSERT INTO t1 VALUES (1, 1, 1); SELECT * FROM t1; id|col1|col2| --|----|----| 1| 1| 1| |
然后,我们对表 t1 中的数据进行更新:
|
UPDATE t1 SET col1 = col1 + 1, col2 = col1 WHERE id = 1; SELECT col1, col2 FROM t1; |
请问查询语句返回的 col1 和 col2 字段的结果分别是什么?
- 对于 SQL 标准以及其他数据库的实现,结果分别为 2 和 1。
- 但是对于 MySQL,结果分别为 2 和 2!
对于 MySQL 而言,如果 UPDATE 语句在表达式中(col2 = col1)使用了前面被更新的字段(col1),将会使用该字段被更新后的值(2)而不是原来的值(1)。
注意,MySQL 这种实现方式和 SQL 标准不同。另外我们还测试了其他数据库,包括 Oracle、Microsoft SQL Server、PostgreSQL 以及 SQLite,它们的实现都遵循了 SQL 标准。
如果我们想要在 MySQL 中实现和标准 SQL 相同的效果,可以在 UPDATE 语句中调整一下被更新字段的顺序。例如:
|
UPDATE t1 SET col2 = col1, col1 = col1 + 1 WHERE id = 1; |
这样一来,字段 col2 在 col1 之前更新,使用的是 col1 旧值(1),得到的结果和 SQL 标准一致。
结束语:一般在编写 UPDATE 语句时,我们不需要关心多个字段的更新顺序。但是由于 MySQL 实现的问题,我们需要注意它们的语法顺序。
到此这篇关于MySQL UPDATE 语句的非标准实现的文章就介绍到这了,更多相关MySQL UPDATE 语句的非标准内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
原文链接:https://blog.csdn.net/horses/article/details/110238573
您可能感兴趣
- idea安装mybatis(IDEA使用mybatis-generator及配上mysql8.0.3版本遇到的bug)
- docker创建mysql环境(docker上部署MySQL的示例)
- mysql死锁是什么原因(MySQL的MaxIdleConns不合理,会变成短连接的原因)
- mysql密码设置(mysql密码中有特殊字符&在命令行下登录的操作)
- mysql 5.5.27 winx64安装配置方法图文教程(mysql 5.5.27 winx64安装配置方法图文教程)
- mysql 删除数据回收空间(浅谈为什么MySQL不建议delete删除数据)
- mysql主从复制原理详解(详解MySQL kill 指令的执行原理)
- zabbix如何配置监控(zabbix监控mysql的实例方法)
- mysql mvcc 隔离级别(详解MySQL事务的隔离级别与MVCC)
- mysql8.0.23.0官方安装手册(MySQL8.0.23安装超详细教程)
- 对mysql性能优化的看法(聊聊MySQL的COUNT的性能,看看怎么最快?)
- mysql有哪些索引和聚簇索引(MySQL 独立索引和联合索引的选择)
- netcore连什么数据库好(.Net Core导入千万级数据至Mysql的步骤)
- mysql大表查询优化方案(mysql查询优化之100万条数据的一张表优化方案)
- python下的sql处理(python中aioysql异步操作MySQL的方法)
- mysql用户登录命令(mysql的登陆和退出命令格式)
- 一道高中题-求杯子的高度(一道高中题-求杯子的高度)
- 网坛停摆三巨头亏损惨重,费德勒跌幅88 纳达少赚2400万(网坛停摆三巨头亏损惨重)
- Beyond 版本《无人深空》主线任务攻略 阿特拉斯之道(版本无人深空主线任务攻略)
- 全球科技界最有钱大佬TOP 15 你知道几位(全球科技界最有钱大佬TOP)
- 2主力后腰缺阵 泰山队奇兵有望获重用,赛季0出场,迎来中超首秀(泰山队奇兵有望获重用)
- 三分71 生死战爆发 篮网旧将丁威迪今天成奇兵,助队赢球(三分71生死战爆发)
热门推荐
- javascript中定义数组的方法(JavaScript中数组sort方法的基本使用与踩坑记录)
- URL如何编码与解码
- mysql全表查询如何优化(MySQL 分组查询的优化方法)
- html中hr标签
- 最新版MySQL 8.0.22下载安装超详细教程(Windows 64位)(最新版MySQL 8.0.22下载安装超详细教程Windows 64位)
- 织梦cms怎么设置页面(织梦CMS调用问答栏目文章到首页实现方法分享)
- idea配置tomcat启动web项目(如何在IntelliJ IDEA 2018上配置Tomcat并运行第一个JavaWeb项目)
- MySQL中interactive_timeout和wait_timeout
- JavaScriptSerializer对Json对象的序列化和反序列化
- Sql的decimal、float、double类型的区别
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9