SQL中单个更新语句中更新多列时的更新顺序

Abh*_*hek 3 mysql sql sql-update

我有一个更新查询:

update  t
set     Col6=Col5
    ,   Col5=Col4
    ,   Col4=Col3
    ,   Col3=Col2
    ,   Col2=Col1
from    [table] t
Run Code Online (Sandbox Code Playgroud)

sql 是否按顺序进行更新?先更新Col6,然后更新Col5,以此类推?我不想在 Col3 中看到 Col1 数字/数据,以防 sql 在通过某种优化查询计划更新 Col3 之前更新 Col2。如果是这样,我将不得不分别写出所有 5 列更新语句。

Gor*_*off 5

一般来说,SQL 更新将左侧和右侧视为set来自两个不同的记录——右侧的“之前”记录和左侧的“之后”记录。在实践中,大多数数据库按顺序评估集合子句(我不确定这是否是必需的)。

MySQL 则不同。它按顺序评估集合子句。 分配后对列的引用是新值,而不是旧值。文档中对此进行了解释:

以下语句中的第二个赋值将 col2 设置为当前(更新后的)col1 值,而不是原始 col1 值。结果是 col1 和 col2 具有相同的值。此行为与标准 SQL 不同。

UPDATE t1 SET col1 = col1 + 1, col2 = col1;
Run Code Online (Sandbox Code Playgroud)

因此,您所写的陈述保证会按顺序进行评估。因为您没有引用已分配的值,所以它会按您的预期工作,并且有记录这样做。

  • 文档说单表更新将按顺序进行,但多表更新可能不会。因此,如果我的更新如下所示: update t1 set t1.Col6=t1.Col5 、 t1.Col5=t1.Col4 、 t1.Col4=t1.Col3 、 t1.Col3=t1.Col2 、 t1.Col2=t1.Col1 , t1.Col1=t2.Col0 from [table1] t1 join table2 t2 on t2.id=t1.id 这将被视为单个表更新还是多个表更新?(我假设是单身) (2认同)
  • @阿布舍克。。。这将是单表语法。但我必须强调,该语法是 SQL Server 语法,而不是 MySQL 语法。如果您错误标记了这个问题,我建议您提出*另一个*问题,明确指定您正在使用的实际数据库。(这个问题有 4 个答案,所有答案都基于 MySQL;更改数据库会使这些答案失效。) (2认同)