UPDATE方向问题

来源:百度知道 编辑:UC知道 时间:2024/06/06 07:57:17
向大家请教一个问题,UPDATE是否总是按从左到右的方向更新的呢?
比如update table set a1=1,a2=2,a3=3
这条语句是否总是按a1,a2,a3的顺序来的?
程序中有一个地方涉及到这个问题,方向很重要。
一开始我也没有怀疑过这个问题,不过从最近客户反映的情况来看,程序中就是这个地方比较可疑。
希望能有比较权威一点的资料,抄也无妨。
那比如UPDATE table SET a1=a2*x,a2=a3*y这样,也就是要更新的字段相互之间又有牵连,这样子的话就会产生不可意料的结果喽?

不是 UPDATE 其实是同步执行的.
比如你可以写出 UPDATE table SET a1 = a2 , a2 = a1 这种语句出来.
表示 a1 与 a2 互换.

不一定不可预料。
a1 = a2*x 是用 a2的原始值 * x 得到. a2 = a3 * y 同样也是用 a3的原始值 * y 得到 但如果你还有 a3 = a1 * z 同样是用 a1 的原始值 * z 得到.

比如 a1 = 1, a2 = 2 ,a3 = 3, x = 4 , y = 5, z = 6.
那么 a1 = 2 * 4 , a2 = 3 * 5 , a3 = 1 * 6 .

就是这么简单.

update语句并不存在什么从左到右更新的说法。
其实一个update语句的原理就存在两个步骤,一.delete 二.insert
就拿你这个例子说吧:
update table set a1=1,a2=2,a3=3
第一步: delete table 先把原来表里的列删除掉
第二步: insert table values(1,2,3) 然后把新列插入到表里。

这个就是update语句的工作原理。
也可以把它理解为是同时执行的。。。

就我个人的理解是这样的:
Update操作本身其实就是一个简单的触发器操作。
在脚本预编译时,就把需要更新的对象放入到缓存中的Inserted表中。
于是就有两张表,原来的table表和缓存中的Inserted表
Set 语句时 等号右边的数据就从Inserted表中取值,对等号左边进行赋值更新。

如果删除再插入的话,势必会影响效率,个人觉得这种处理方式不太可能,因为当该表引用了其他表的主键作为外键的话,是删除不掉的,假设这个理论成立的话,那肯定是在更深层次的地方做了特殊处理,屏蔽了外键,在插入时又加入。

相关内容可以参考SQL联机丛书关于Update的介绍,尤其是OUTPUT的操作。
仅供参考

关于次序问题是这