2013-02-20 81 views
4

非常简单的问题,但我找不到答案。UPDATE语句是否同时设置所有的值(同时)?

假设我有表var与列foobar,这两者都是整数,在0目前。

如果我运行:

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

那么会是怎样的bar价值? 1或2?

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

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

+0

没有增量语句,因此如果foo = 0,那么你将在两列中得到1,1。 – BaconSah 2013-02-20 20:13:08

+0

增量语句是什么样的? (如果我想'bar'成为2) – hellohellosharp 2013-02-20 20:13:59

+0

你将不得不使用一个循环 做 直到 一套 = VAL VAL + 1 结束 直到 作为 伪说法,即在存储过程或在主程序。是的,我同意这是一个骗局。 – BaconSah 2013-02-20 20:18:02

回答

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 var SET foo=foo+1, bar=foo+1foo将被设置为foo+1,那么bar更新将在foo+1使用foo新设置的值。

也许值得注意的是,这种行为不同于SQL标准,这表明所有列更新应该在概念上“同时”发生。

-2

富= 1,巴= 1不管顺序[编辑:在MS-SQL。 (显然我在MySQL中不好)]

+1

注释中的SQL小提琴链接表明,这不是MySQL中的情况 – 2013-02-20 20:30:51

2

该命令在MySQL中很重要。此外,你可以做到以下几点:

update test set foo=foo+1, bar=foo+1, foo=bar+1; 

BTW,这里是另一个有用的MySQL特定技巧:

insert into test (foo, bar) values ('some text', MD5(foo)); 
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