同一条UPDATE语句中交叉更新列的结果是否有官方确定性保障?
关于同一条UPDATE语句中多列更新的结果稳定性问题
在标准SQL以及包括SQL Server在内的绝大多数主流数据库中,同一条UPDATE语句里的列更新是基于行的原始值计算的,各列的更新操作不会互相干扰,所以你写的这条语句确实能稳定得到预期结果。
具体逻辑说明
执行UPDATE时,数据库会先读取每行的原始数据,把SET子句里所有赋值表达式的结果都用这些原始值计算出来,再统一把计算好的结果应用到行上。举你的例子来说:
Column1 = Column2用的是更新前的Column2值(200)Column2 = Column3用的也是更新前的Column3值(3000)
完全不会出现“Column2先被更新,然后Column1用更新后的Column2值”的情况。
示例验证
更新前数据
| Column1 | Column2 | Column3 |
|---|---|---|
| 10 | 200 | 3000 |
执行UPDATE语句
UPDATE Table1 SET Column1 = Column2, Column2 = Column3
更新后预期结果
| Column1 | Column2 | Column3 |
|---|---|---|
| 200 | 3000 | 3000 |
这种行为是SQL标准的规定,也是几乎所有关系型数据库的通用实现逻辑,即便你没在MSDN找到明确的单独说明,也可以放心使用。
内容的提问来源于stack exchange,提问作者user2316154
相关产品推荐
相关产品推荐

