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-------------------------------------------------

原文地址:https://www.cnblogs.com/JiangLe/p/9580441.html

时间: 2024-10-14 14:21:34

MySQL update 语句与标准SQL不同的地方的相关文章

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

1.Mysql update语句赋值嵌套select  点击(此处)折叠或打开 update a set col=(select col from a where id='5') where id>5 and id<10; 报错了 ERROR 1093 (HY000): You can't specify target table 'a' for update in FROM clause 经过研究 发现是 mysql 定义update语句不能同时对同一张进行set 赋值操作,也就是说 upd

MySQL UPDATE语句SET多字段,逗号连接和AND连接的区别

参考链接:https://blog.csdn.net/qq_28382071/article/details/79759559 MySQL正确的UPDATE语法如下: 测试表数据和字段格式 执行以下UPDATE语句,会有什么结果? 第三句UPDATE语句报错,其他成功执行 执行结果: 说明: 1和4是正确UPDATE语句,2.3.5.6是使用AND连接的UPDATE. MySQL使用AND连接的语句时,相当于执行了下面的SQL: UPDATE hutz SET age = (1 AND addr

mysql update语句的一个知识点说明

当执行update语句时,如果受影响的行数是0,返回的也是true. $conn = new mysqli(); $sql = "update ..."; $query = $conn->query($sql); var_dump($query); //此时,如果update   sql语句执行成功,但是影响行数为0,$query是true. 影响行数: $conn->affected_rows; // 如果执行sql语句出错,返回-1,

mysql update语句与limit的结合使用

有时候有需要批量更新数据表中从多少行到多少行的某个字段的值 mysql的update语句只支持更新前多少行,不支持从某行到另一行,比如 UPDATE tb_name SET column_name='test' ORDER BY id ASC LIMIT 30; 更新前30行的某个字段内容,没什么问题. UPDATE tb_name SET column_name='test' ORDER BY id ASC LIMIT 20,10; 更新从20行到30行的某个字段的内容,这样会报错. 解决办法

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

更新一个字段,在它的后面加一个字符串,不查询数据库得到这个字段值 怎么添加?? 例如: 我的test表,有个user字段,我现在想在它后面加了另一个用户的名字 我在mysql数据库这样写 UPDATE test SET user= user+ ',phpchina' WHERE id= '2'; 这样是不对的,mysql数据库把它当成数字相加了,user字段值变成0了. 应该: UPDATE test SET user= CONCAT(user,',phpchina') WHERE id= '2

MySql更新语句(命名Sql)

1.匹配并更新渠道匹配状态 UPDATE rec_sourceidx a,rec_data b SET a.matched='Y' AND b.matched='Y' WHERE a.chnlcd=b.chnlcd AND a.chnldt=b.chnldt AND a.chnlsq=b.chnlsq AND a.chnlcd=#chnlcd#; AND a.chnlst=#lchnlst# and b.chnlst=#fchnlst# 2.根据核心流水更新平台交易状态 UPDATE #tabl

标准sql语句,学习

标准SQL语句总结标准SQL语句总结,标准SQL语言基本上适用于下面所列出的数据库软件 ----------------------------------------------------------------------------- 数据库软件清单 A商业数据库软件如下 1.微软的MS SQL Server和Access 2.IBM的DB2,informax 3.Sybase的大型数据库ASE,中小型数据库ASA 4.甲骨文公司的Oracle8.0,oracle9i系列 5.Borla

MySQL UPDATE 查询

MySQL UPDATE 查询 如果我们需要修改或更新 MySQL 中的数据,我们可以使用 SQL UPDATE 命令来操作.. 语法 以下是 UPDATE 命令修改 MySQL 数据表数据的通用 SQL 语法: UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause] 你可以同时更新一个或多个字段. 你可以在 WHERE 子句中指定任何条件. 你可以在一个单独表中同时更新数据. 当你需要更新数据表中指定行

雷林鹏分享:MySQL UPDATE 查询

如果我们需要修改或更新 MySQL 中的数据,我们可以使用 SQL UPDATE 命令来操作.. 语法 以下是 UPDATE 命令修改 MySQL 数据表数据的通用 SQL 语法: UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause] 你可以同时更新一个或多个字段. 你可以在 WHERE 子句中指定任何条件. 你可以在一个单独表中同时更新数据. 当你需要更新数据表中指定行的数据时 WHERE 子句是非常