sql - 什么保证 SQL 规范为 UPDATE 提供读取和写入某些列的内容

标签 sql sql-server tsql

SQL 规范为 UPDATE 语句提供什么保证,其中某些列同时被更新和读取?

从我的实验中我可以看到,当列在“=”符号的右侧使用时,SQL 使用旧值,即使我们在同一语句中更新了这一列。

考虑以下 T-SQL 代码。

create table test
(
    a int primary key,
    b int
)

insert into test
values (1,2)

update test
set a = b,
    b = 3

select *
from test

update test
set b = 4,
    a = b

select *
from test

上面的示例产生:

(2, 3)
(3, 4)

即使在第二次更新中它似乎在“a”之前更新了“b”列。是否保证如果我引用某些列,我将得到不受此 UPDATE 影响的结果,而与 SET 子句中的赋值顺序无关?

最佳答案

SQL 试图成为一种基于集合的语言。对于 update,这意味着数据库系统试图表现得“好像”所有更新都是并行应用的,既适用于一行中的所有列,也适用于集合中的所有行。 (事实上​​ ,未能正确实现可能会导致 Halloween Problem )。

由于所有操作都是“并行发生”的,因此没有赋值可以看到任何其他赋值操作的结果,因此它们都基于任何列的原始值。

关于sql - 什么保证 SQL 规范为 UPDATE 提供读取和写入某些列的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39268735/

相关文章:

mysql - `SELECT field AS` 在 2 个表之间使用 UNION 导致错误#1064

sql - 尝试从具有一对多关系的两个表中插入选择

sql-server - 我们无法使用 POWER BI 提供的凭据进行身份验证

没有特定内连接的 SQL 查询

tsql - T-SQL 中的形状查询

sql - 如何选择一列不同的内容?

sql - 根据特定条件过滤行

sql - 如何在 SQL 中获取 GROUP BY 之后的不同计数?

sql - 在 SQL Server 中使用 2 个不同的列分组

java - 如何优化 JPQ JOIN 查询以运行得更快