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不同的地方的更多相关文章

  1. Mysql update语句赋值嵌套与在表列中数据后面增加数据

    1.Mysql update语句赋值嵌套select  点击(此处)折叠或打开 update a set col=(select col from a where id='5') where id&g ...

  2. MySQL update语句和insert插入语句写法完全不一样啊,不要搞混

    1.mysql update 语句: update user set name = 'xiaoming',age = 18 where uid = 3000; 更新记录时update操作也不需要写ta ...

  3. mysql Update语句 语法

    mysql Update语句 语法 作用:用于修改表中的数据.广州大理石机械构件 语法:UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 mysql Update语句 示例 ...

  4. MySQL 主外键约束与标准SQL不同的地方

    [标准SQL的外键约束条件] 1): 子表引用父表的主键 drop table if exists child,parent; create table if not exists parent( i ...

  5. mysql update语句与limit的结合使用

    有时候有需要批量更新数据表中从多少行到多少行的某个字段的值 mysql的update语句只支持更新前多少行,不支持从某行到另一行,比如 UPDATE tb_name SET column_name=' ...

  6. mysql update语句

    UPDATE ClientBankInfo SET status = 3 WHERE sn IN (SELECT sn FROM zjzc.ClientBankInfo WHERE cardNo IN ...

  7. mysql update语句,修改字段,,或者是批量修改字段

    更新一个字段,在它的后面加一个字符串,不查询数据库得到这个字段值 怎么添加?? 例如: 我的test表,有个user字段,我现在想在它后面加了另一个用户的名字 我在mysql数据库这样写 UPDATE ...

  8. MySQL Update语句用法

    用一个表的某列值更新另外一个表的某列值的sql语句: update tableA a innner join tableB b on a.column_1 = b.column_1 set a.col ...

  9. mysql update语句的执行流程是怎样的

    update更新语句流程是怎么样的 update更新语句基本流程也会查询select流程一样,都会走一遍. update涉及更新数据,会对行加dml写锁,这个DML读锁是互斥的.其他dml写锁需要等待 ...

随机推荐

  1. Dicom格式文件解析器[转]

    Dicom格式文件解析器   Dicom全称是医学数字图像与通讯,这里讲的暂不涉及通讯那方面的问题 只讲*.dcm 也就是diocm格式文件的读取,读取本身是没啥难度的 无非就是字节码数据流处理.只不 ...

  2. Python标准库笔记(3) — datetime模块

    datetime模块提供了简单和复杂的方式用于操纵日期和时间的类.虽然支持日期和时间运算,但实现的重点是为了输出格式化和操作高效地提取属性. 1. 模块内容 内容 描述 常量   datetime.M ...

  3. Python实践摘录

    1:中文编码问题 Python语言默认不识别UTF-8的编码字符串,所以当文件中有中文并且是以UTF-8编码时,需要在python文件头部加一行注释,指明识别utf-8编码. # coding=utf ...

  4. jenkins里面使用批处理命令进行自动部署

    http://blog.csdn.net/hwhua1986/article/details/47974047

  5. loadrunner 脚本开发-参数化之将内容保存为参数、参数数组及参数值获取

    转自:http://blog.sina.com.cn/s/blog_13cc013b50102v49c.html(查看原文) 在VuGen中默认使用{}的字符串称为参数 注意:参数必须在双引号中才能用 ...

  6. Android 仿知乎创意广告

    代码地址如下:http://www.demodashi.com/demo/14904.html 一.概述 貌似前段时间刷知乎看到的一种非常有特色的广告展现方式,即在列表页,某一个Item显示背后部分广 ...

  7. 使用std::find_if提取序列容器的子串

    一个需求是这样的,一个vector容器中,我需要提取满足一定条件的元素的序列.就比如,一个树形结构,我把该接口拍扁成vector容器,每个节点都有一个惟一ID. 以下就是根据特定的ID查找节点下的子节 ...

  8. MATLAB 向量

    MATLAB 向量: 1.MATLAB 行向量: 创建行向量括在方括号中的元素的集合,用空格或逗号分隔的元素. 2.MATLAB 列向量: 创建列向量括在方括号中的元素的集合,使用分号来分隔的元素. ...

  9. Asynchronous and non-Blocking I/O 翻译[收藏好文]

    http://www.tornadoweb.org/en/stable/guide/async.html Real-time web features require a long-lived mos ...

  10. 树莓派进阶之路 (010) - 树莓派raspi-config配置(转)

    经过前面两步我们的树莓派已经正常的工作起来了,但是在真正用它开发之前还需要进行一些列的配置以及软件的安装,这样开发起来才会得心应手,下面我们介绍一下常用的软件和服务 1.配置选项: 树莓派第一次使用的 ...