when update a=b,b=a in sql

在程序语句中,如果想修改两个字段的值,其中一个字段的值根据另一个字段的值计算所得。

那么可以这样

obj.a = 1;
obj.b = obj.a;

那如何想在sql里达到这个目的,该怎么办呢? 很自然的想到,可不可以这样(在sql server 2014执行):

-- create table #t ( a int, b int)
-- insert into #t values(1, 2)

update top (1) #t set a=b,b=a 

-- drop table #t

结果是什么呢? 我们看看

a    |    b
2    |    1

神奇的一幕发生了:两个字段的值互换了。意思是,b的值在计算时并没有使用a的新值而是使用a的旧值。为什么会这样呢?与deleted表和inserted表有关系吗?

 

我们再来看看Mysql

-- create temporary table t ( a int, b int)
-- insert into t values(1, 2)

update t set a=b,b=a limit 1;

-- drop table t

结果却是

a    |    b
2    |    2

在Mysql里,按预期的工作了。

 

这是什么情况呢? 这里面有什么道道呢? 应该和数据库的执行策略有关系。有待查阅!

发表评论

电子邮件地址不会被公开。