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写锁需要等待 ...
随机推荐
- cocos2d-js 3.0 屏幕适配方案 分辨率适应
首先介绍一个api和相应的参数: cc.view.setDesignResolutionSize(1024, 768, cc.ResolutionPolicy.FIXED_WIDTH); 这里设置游戏 ...
- Java HmacSHA1算法
Java HmacSHA1算法 public static String hmacSha1(String src, String key) { try { SecretKeySpec signingK ...
- python3 发送邮件功能
阿-_-涵的博客 #首先写一个模块功能,发邮件功能打包起来 from smtplib import SMTP from email.mime.text import MIMEText def send ...
- python之函数用法isupper()
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法isupper() #http://www.runoob.com/python/att ...
- android手机导入.cer证书文件的方法
访问很多https协议的网站需要安装证书,手机也可以导入cer文件,你知道么?本文将通过简单的两步告诉你手机安装cer文件的方法. 步骤一:请先将数字证书文件“******.cer”文件复制到SD卡的 ...
- Spring框架使用(控制反转,依赖注入,面向切面AOP)
参见:http://blog.csdn.net/fei641327936/article/details/52015121 Mybatis: 实现IOC的轻量级的一个Bean的容器 Inversion ...
- 查看tcp连接信息socket几个常用的命令
查看tcp连接几个常用的命令 1 ss ss 列出所有的连接,包括tcp连接.udp连接.unix socket.raw socket ss -t 列出所有tcp连接 ss -tl 列出所有处于监听状 ...
- ubuntu安装过程中遇到问题小结
一.下载 官网下载地址:https://www.ubuntu.com/download/desktop/contribute?version=16.04.4&architecture=amd6 ...
- 如何从windows中拷贝文件到linux (ubuntu)??
安装ssh,然后用客户端似的界面远程手动拖动即可.
- 【LeetCode】3. Longest Substring Without Repeating Characters (2 solutions)
Longest Substring Without Repeating Characters Given a string, find the length of the longest substr ...