非常简单的问题但我找不到答案。
假设我的表var
包含foo
和bar
列,两者都是整数,目前为0 。
如果我跑:
UPDATE var SET foo=foo+1, bar=foo+1
那么bar
的价值是多少? 1还是2?
如果我切换订单会改变吗?
UPDATE var SET bar=foo+1, foo=foo+1
答案 0 :(得分:7)
如Joe's SQL Fiddle comment所示,列更新的执行顺序确实很重要。 UPDATE
的MySQL文档表明了这一点,声明每个列更新的表达式将按声明的顺序进行评估,并始终使用列的“当前”值:
如果从表中访问要在表达式中更新的列,
UPDATE
将使用列的当前值。例如,以下语句将col1
设置为比其当前值多一个:UPDATE t1 SET col1 = col1 + 1;
以下语句中的第二个赋值将
col2
设置为当前(更新的)col1
值,而不是原始col1
值。结果是col1
和col2
具有相同的值。此行为与标准SQL不同。UPDATE t1 SET col1 = col1 + 1, col2 = col1;
单表UPDATE分配通常从左到右进行评估。对于多表更新,无法保证以任何特定顺序执行分配。
因此对于UPDATE var SET foo=foo+1, bar=foo+1
,foo
将设置为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不好)]