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/