MySQL update 语句与标准SQL不同的地方
【SQL标准中有一个叫同时执行的概念】
同时执行指的是在同一个子句中的各个部分的执行时机是不区分先后的,如下面的SQL语句
select abs(-1),abs(2);
+---------+--------+
| abs(-1) | abs(2) |
+---------+--------+
| 1 | 2 |
+---------+--------+
1 row in set (0.01 sec)
按SQL标准的说法 abs(-1) 与 abs(2) 这两个函数是“同时执行”的!
【MySQL的Update与SQL标准相背】
1): 为了说明问题我定义如下表结构,表t包含两个数据列`x`,`y`
create table t(id int not null auto_increment primary key, x int, y int);
2): 给表t增加一行数据
insert into t(x,y) values(1,1); select * from t;
+----+------+------+
| id | x | y |
+----+------+------+
| 1 | 1 | 1 |
+----+------+------+
1 row in set (0.00 sec)
3): 执行一条update语句
update t set x=x+1 ,y=x; select * from t;
+----+------+------+
| id | x | y |
+----+------+------+
| 1 | 2 | 2 |
+----+------+------+
1 row in set (0.00 sec)
从上面的结果可以看出update语句不是同时执行的,如果按同时执行的理论y=x这个语句执行时x的值还会是初始的值“1”而不是自增后的值“2”;
如果你觉得这样的结果对你来说没有问题,那我们来看下一个update语句,我只是把“x=x+1”和“y=x”这两个部分交换一下。
4): 执行调整后的SQL语句
update t set y=x, x=x+1; mysql> select * from t;
+----+------+------+
| id | x | y |
+----+------+------+
| 1 | 3 | 2 |
+----+------+------+
1 row in set (0.00 sec)
可以看到MySQL数据库中的update并不是同时执行的,它是有先后次序的,而这个先后次序会直接影响到你执行SQL的结果
【总结】
编写程序时就要意识到MySQL在处理update语句特殊性,前面执行的赋值语句会对后台的语句产生影响;最后这个并不是一个bug,之所以这么
说是因为MySQL在其官方文档中明确的提到了这一点,在这个Bug算Future的年代;我们也只能说这个是对SQL标准的一个变通吧。
官方文档:https://dev.mysql.com/doc/refman/8.0/en/ansi-diff-update.html
-----------------------------http://www.sqlpy.com-------------------------------------------------
-----------------------------http://www.sqlpy.com-------------------------------------------------
MySQL update 语句与标准SQL不同的地方的更多相关文章
- Mysql update语句赋值嵌套与在表列中数据后面增加数据
1.Mysql update语句赋值嵌套select 点击(此处)折叠或打开 update a set col=(select col from a where id='5') where id&g ...
- MySQL update语句和insert插入语句写法完全不一样啊,不要搞混
1.mysql update 语句: update user set name = 'xiaoming',age = 18 where uid = 3000; 更新记录时update操作也不需要写ta ...
- mysql Update语句 语法
mysql Update语句 语法 作用:用于修改表中的数据.广州大理石机械构件 语法:UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 mysql Update语句 示例 ...
- MySQL 主外键约束与标准SQL不同的地方
[标准SQL的外键约束条件] 1): 子表引用父表的主键 drop table if exists child,parent; create table if not exists parent( i ...
- mysql update语句与limit的结合使用
有时候有需要批量更新数据表中从多少行到多少行的某个字段的值 mysql的update语句只支持更新前多少行,不支持从某行到另一行,比如 UPDATE tb_name SET column_name=' ...
- mysql update语句
UPDATE ClientBankInfo SET status = 3 WHERE sn IN (SELECT sn FROM zjzc.ClientBankInfo WHERE cardNo IN ...
- mysql update语句,修改字段,,或者是批量修改字段
更新一个字段,在它的后面加一个字符串,不查询数据库得到这个字段值 怎么添加?? 例如: 我的test表,有个user字段,我现在想在它后面加了另一个用户的名字 我在mysql数据库这样写 UPDATE ...
- MySQL Update语句用法
用一个表的某列值更新另外一个表的某列值的sql语句: update tableA a innner join tableB b on a.column_1 = b.column_1 set a.col ...
- mysql update语句的执行流程是怎样的
update更新语句流程是怎么样的 update更新语句基本流程也会查询select流程一样,都会走一遍. update涉及更新数据,会对行加dml写锁,这个DML读锁是互斥的.其他dml写锁需要等待 ...
随机推荐
- mysql版本导致的hibernate 方言问题
今天在看hibernate视频时,看到视频上人家的hibernate.cfg.xml配置文件在配置hibernate方言时,发现视频上是这样写的<property name="dial ...
- mahout基于Hadoop的CF代码分析(转)
来自:http://www.codesky.net/article/201206/171862.html mahout的taste框架是协同过滤算法的实现.它支持DataModel,如文件.数据库.N ...
- climbing-stairs-动态规划,爬楼梯的路径数
You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...
- Multitenant Architecture---PDB与CDB
一.多租户框架 多租户技术(英语:multi-tenancy technology)或称多重租赁技术,是一种软件架构技术,它是在探讨与实现如何于多用户的环境下共用相同的系统或程序组件,并且仍可确保各用 ...
- Android插件化开发之解决OpenAtlas组件在宿主的注冊问题
OpenAtlas有一个问题,就是四大组件必须在Manifest文件里进行注冊,那么就必定带来一个问题,插件中的组件都要反复在宿主中注冊.像Service,ContentProvider等组件眼下没有 ...
- weblogic启动报错|unable to create new native threadjava
问题描述: <-- 上午10时20分01秒 CST> <Critical> <WebLogicServer> <BEA-> <Server sub ...
- Spring Cloud开发实践 - 04 - Docker部署
Docker的安装和命令可以参考 https://www.cnblogs.com/milton/p/9866963.html . 资源规划 这一步要区分传统资源和Docker资源, 为后面的细节定好基 ...
- d3dx9库函数
这几天参考了csdn上大坡先生()整理的d3dx9的库函数,我做了一些机械的事情.就算过年练打字了.以下为我整理的d3dx9库函数简略版,以后除了msdn外,存档备用: D3DXCOLOR* D3DX ...
- 从html加载json文件想起
原文来自:https://www.cnblogs.com/dibaosong/p/4572274.html#top 文中给出了data.json文件内容 还给出了html文件内容 ok. 1.新建工程 ...
- JavaScript Boolean Object 逻辑
Create a Boolean Object The Boolean object represents two values: "true" or "false&qu ...