什么保证SQL规范为UPDATE提供读写一些列的功能

时间:2016-09-01 10:11:54

标签: 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子句中的赋值顺序无关?

2 个答案:

答案 0 :(得分:2)

您观察到的行为是正确的,它是标准的,甚至应该是直观的。

您缺少的部分是数据库和事务的ACID属性。在执行语句之前,update不会生效。因此,引用表中行的任何值都来自"之前"行的视图。设置的值位于"之后"行的视图。

答案 1 :(得分:2)

SQL尝试成为基于集合的语言。对于update,这意味着数据库系统尝试“as-if”并行应用所有更新,包括行中的所有列以及集合中的所有行。 (实际上,未能正确实现这一点可能导致link)。

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