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版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/horses/article/details/110238573CREATE 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 标准以及其他数据库的实现,结果分别为 21
  • 但是对于 MySQL,结果分别为 22

对于 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 语句的非标准内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • mysql update语句的执行过程详解

    以前有过一篇关于MySQL查询语句的执行过程,这里总结一下update语句的执行过程.由于update涉及到数据的修改,所以,很容易推断,update语句比select语句会更复杂一些. 1,准备 创建一张test表 CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `c` int(11) NOT NULL DEFAULT '0' COMMENT '数值', PRIMARY KEY (`id`) ) ENGINE=InnoDB

  • Mysql联表update数据的示例详解

    1.MySQL UPDATE JOIN语法 在MySQL中,可以在 UPDATE语句 中使用JOIN子句执行跨表更新.MySQL UPDATE JOIN的语法如下: UPDATE T1, T2, [INNER JOIN | LEFT JOIN] T1 ON T1.C1 = T2. C1 SET T1.C2 = T2.C2, T2.C3 = expr WHERE condition 更详细地看看MySQL UPDATE JOIN语法: 首先,在UPDATE子句之后,指定主表(T1)和希望主表连接表

  • MySQL将select结果执行update的实例教程

    一.单表查询->更新 UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause] 二.多表联合查询->更新 UPDATE a INNER JOIN (SELECT yy FROM b) c ON a.id = c.id SET a.xx = c.yy [WHERE Clause] 上面的 INNER JOIN ,可以换为 LEFT JOIN . RIGHT JOIN 等联合查询. SET 后的字段必须为 a

  • 记一次MySQL更新语句update的踩坑

    背景 最近在一次线上作业过程中执行了一句DML语句,本以为万无一失,结果应用反馈说没有更新,数据还是没有变,最后经过排查才发现是我语句写错了,导致update语句执行的结果与预期不符. 情景再现 为了方便演示,建立一张用户表,同时插入五条数据. create table user( id int(12) comment '用户主键id', name varchar(36) comment '用户名', age int(12) comment '年龄'); insert into user val

  • 关于Mysql update修改多个字段and的语法问题详析

    在MySQL里面update一条记录,语法都正确的,但记录并没有被更新... 问题语句 执行之前的记录是这样的: 执行之后的记录是这样的: 可以看到,实际上是有效果的: why? 看起来,语法是完全没有问题,MySQL官方文档的update语法: 看到assignment_list的格式是以逗号分隔的col_name=value列表,一下子豁然开朗,开发同学想要的多字段更新语句应该这样写: 小结:在一条UPDATE语句中,如果要更新多个字段,字段间不能使用"AND",而应该用逗号分隔.

  • MySQL update set 和 and的区别

    问题描述 最近接到一个奇怪的咨询,update 语句执行没有报错,但是没有更新数据,具体有问题的语句类似于如下形式: update test.stu set cname = '0' and math = 90 and his = 80 where id = 100; 原因分析 直观上看,这个 update 语句的语法是有问题的,正常更新多列数据的语法应该是用逗号,类似于如下形式: update test.stu set cname = '0',math = 90,his = 80 where i

  • mysql修改记录时update操作 字段=字段+字符串

    在有些场景下,我们需要对我们的varchar类型的字段做修改,而修改的结果为两个字段的拼接或者一个字段+字符串的拼接. 如下所示,我们希望将xx_role表中的name修改为name+id. 在mysql下,我们直接通过"+"来操作,会提示错误. 操作符"+"是用来对数字进行加操作的,这里需要使用关键字concat,表示拼接. 同样的,我们也可以利用字段+字符串来拼接. 这里稍微说一下"+"的操作,他是用来对数字类型的字段进行加操作的,如下所示:

  • Mysql事务中Update是否会锁表?

    两种情况: 1.带索引 2.不带索引 前提介绍: 方式:采用命令行的方式来模拟 1.mysq由于默认是开启自动提交事务,所以首先得查看自己当前的数据库是否开启了自动提交事务. 命令:select @@autocommit; 结果如下: +--------------+ | @@autocommit | +--------------+ | 0 | +--------------+ 如果是1,那么运行命令:set autocommit = 0;设置为不开启自动提交 2.当前的数据库表格式如下 tb

  • mysql update case 更新字段值不固定的操作

    在处理批量更新某些数据的时候,如果跟你更新的字段的值都一样,比如某个状态都更新为某个固定值, 直接用update table set xxx=xxx where xxx=xxx 这种即可 如果要更新的字段的值是不固定的,用下面的update case when where 这种方式就更方便了 UPDATE tablename set a1= CASE userid WHEN 1 THEN a1+5 WHEN 2 THEN a1+2 END, a2= CASE userid WHEN 1 THEN

  • Mysql update多表联合更新的方法小结

    下面我建两个表,并执行一系列sql语句,仔细观察sql执行后表中数据的变化,很容易就能理解多表联合更新的用法 student表 class表 1. 执行 UPDATE student s , class c SET s.class_name='test00',c.stu_name='test00' WHERE s.class_id = c.id student表 class表 2. 执行 UPDATE student s JOIN class c ON s.class_id = c.id SET

随机推荐