这个查询如何交换tab1的col1和col2的数据? 基本上,为了交换我们需要临时变量,但这里我们没有。
2
个回答
Quassnoi
发布于
2010-10-27
已采纳
0
人赞同
只是出于兴趣,你知道即使隔离级别设置为 "未提交"(Read Uncommitted),这是否也能工作?
Quassnoi
:
@Paul:是的,确实如此。尽管有
READ UNCOMMITED
,但
DML
查询会放置锁。
onedaywhen
发布于
2010-10-27
0
人赞同
我的笔记归功于乔-塞尔科。
<set clause list>
中的每个赋值都是并行执行的,每个SET子句都会一次性改变所有符合条件的行。
每个SET子句都会一次改变所有符合条件的行。 或者至少
这是理论上的模型。 在实践中,实现会首先
使用WHERE子句一次性标记表中的所有合格行。
子句。 如果没有问题,那么SQL引擎就会在工作存储器中为每条被标记的行制作一个副本。
每个被标记的行在工作存储器中的副本。 每个SET子句的执行都是基于
每一个SET子句都是根据旧的行图像来执行的,结果被放到新的行图像中。
最后,旧行被删除,新行被插入。 如果在这些过程中出现
如果在这些过程中发生了错误,那么系统会进行ROLLBACK,表会保持不变,并且错误会被删除。
不变,并报告错误。 这种并行性与
与你在传统的第三代编程语言中发现的不同。
语言,所以可能很难学习。 这个功能可以让你写一个
语句来交换两列中的值,因此。
UPDATE MyTable
SET a = b, b = a;
BEGIN ATOMIC
UPDATE MyTable
SET a = b;
UPDATE MyTable
SET b = a;
END;
在第一个UPDATE中,a列和b列将在每一行交换数值。 在
第二对UPDATE中,a列将获得每行中b列的所有值
列b在每一行的值。 在第二对UPDATE中,a,现在
具有与b的原始值相同的值,将被写回到
就是这样。
UPDATE tabl SET col1 = col2, col2 = col1
没有
查询看到其结果,以避免万圣节问题。DML
在内部,
锁被放在记录(或数据页)上,旧值被读取并存储到临时变量中,然后锁被提升为UPDATE
,新值(存储在临时变量中)被写入适当的列。EXCLUSIVE