4

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

假设我有一个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

4

4 回答 4

7

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

如果您访问要在表达式中更新的表中的列,则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+1,foo将设置为foo+1,那么bar更新将使用新设置的fooin值foo+1

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

于 2013-02-20T20:47:15.613 回答
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));
于 2013-02-20T20:35:59.717 回答
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
于 2013-02-20T21:53:18.087 回答
-2

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

于 2013-02-20T20:29:22.443 回答