什么保证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
子句中的赋值顺序无关?
答案 0 :(得分:2)
您观察到的行为是正确的,它是标准的,甚至应该是直观的。
您缺少的部分是数据库和事务的ACID属性。在执行语句之前,update
不会生效。因此,引用表中行的任何值都来自"之前"行的视图。设置的值位于"之后"行的视图。
答案 1 :(得分:2)
SQL尝试成为基于集合的语言。对于update
,这意味着数据库系统尝试“as-if”并行应用所有更新,包括行中的所有列以及集合中的所有行。 (实际上,未能正确实现这一点可能导致link)。
由于所有操作都是“并行发生”,因此任何分配都无法看到任何其他赋值操作的结果,因此它们都基于任何列的原始值。