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

4
非常简单的问题,但我找不到答案。
假设我有一个名为var的表,其中包含foobar两列,这两列都是整数,当前值为0
如果我运行: UPDATE var SET foo=foo+1, bar=foo+1 那么bar的值将是什么?是1还是2?
如果我更改顺序会发生变化吗? UPDATE var SET bar=foo+1, foo=foo+1

没有增量语句,因此如果foo = 0,则两列中都将得到1,1。 - BaconSah
一个增量语句是什么样子的?(如果我想让 bar 等于 2) - kmoney12
你需要使用一个循环做直到设置val = val + 1直到结束作为伪语句,即在存储过程或主程序中。是的,我同意这是一个重复的问题。 - BaconSah
3
我同意可能重复的观点,但我也很好奇为什么sqlfiddle似乎持不同意见。 http://sqlfiddle.com/#!2/ffdb6/1 这是sqlfiddle特有的问题吗? - Joe
1
@joe 可能不是重复的问题。重复的问题是关于 SQL Server 和标准 SQL 的。也许 MYSQL 的行为不同。如果关闭的话,我会投票重新打开,因为这不是可能的重复行为描述。 - Martin Smith
1
从这里看起来似乎确实不同 https://dev59.com/m3VD5IYBdhLWcg3wQZQg#559291 - Martin Smith
4个回答

7
根据Joe的SQL Fiddle评论,列更新的顺序确实很重要。MySQL的UPDATE文档指出了这一点,说明每个列更新的表达式将按声明的顺序进行评估,并且始终使用列的“当前”值:

If you access a column from the table to be updated in an expression, UPDATE uses the current value of the column. For example, the following statement sets col1 to one more than its current value:

UPDATE t1 SET col1 = col1 + 1;

The second assignment in the following statement sets col2 to the current (updated) col1 value, not the original col1 value. The result is that col1 and col2 have the same value. This behavior differs from standard SQL.

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

Single-table UPDATE assignments are generally evaluated from left to right. For multiple-table updates, there is no guarantee that assignments are carried out in any particular order.

对于 UPDATE var SET foo=foo+1, bar=foo+1foo 将会被设置为 foo+1,然后 bar 的更新将使用 foo+1 中新设置的值。

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


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));

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

-2

无论顺序如何,foo=1,bar=1 [编辑:在MS-SQL中。 (显然是我的MySQL错误)]


1
评论中的SQL Fiddle链接显示在MySQL中并非如此。 - Martin Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接