UPDATE语句是否同时设置所有值(同时)?

时间:2013-02-20 20:11:15

标签: mysql sql

非常简单的问题但我找不到答案。

假设我的表var包含foobar列,两者都是整数,目前为0

如果我跑:

UPDATE var SET foo=foo+1, bar=foo+1

那么bar的价值是多少? 1还是2?

如果我切换订单会改变吗?

UPDATE var SET bar=foo+1, foo=foo+1

4 个答案:

答案 0 :(得分:7)

Joe's SQL Fiddle comment所示,列更新的执行顺序确实很重要。 UPDATE的MySQL文档表明了这一点,声明每个列更新的表达式将按声明的顺序进行评估,并始终使用列的“当前”值:

  

如果从表中访问要在表达式中更新的列,UPDATE将使用列的当前值。例如,以下语句将col1设置为比其当前值多一个:

UPDATE t1 SET col1 = col1 + 1;
     

以下语句中的第二个赋值将col2设置为当前(更新的)col1值,而不是原始col1值。结果是col1col2具有相同的值。此行为与标准SQL不同。

UPDATE t1 SET col1 = col1 + 1, col2 = col1;
     

单表UPDATE分配通常从左到右进行评估。对于多表更新,无法保证以任何特定顺序执行分配。

因此对于UPDATE var SET foo=foo+1, bar=foo+1foo将设置为foo+1,然后bar更新将在{{1}中使用新设置的foo值}}

值得注意的是,此行为与SQL标准不同,后者表示所有列更新应在概念上“同时”发生。

答案 1 :(得分:2)

订单在MySQL中很重要。此外,您可以执行以下操作:

update test set foo=foo+1, bar=foo+1, foo=bar+1;
顺便说一句,这是另一个有用的特定于MySQL的技巧:

insert into test (foo, bar) values ('some text', MD5(foo));

答案 2 :(得分:0)

注意 - 对于postgresql,查询在查询开始时使用值执行,而不是在执行查询时动态更改值

create table test (
field1 int2 default 0,
field2 int2 default 0
);


insert into test values (1, 2);


update test set field1 = field2, field2 = field1 +1;


select * from test;

结果:

field1, field2
    2,2

答案 3 :(得分:-2)

无论顺序如何,

foo = 1,bar = 1 [编辑:在MS-SQL中。 (显然我的MySQL不好)]