非常简单的问题,但我找不到答案。
假设我有一个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
正如Joe 的 SQL Fiddle 评论所指出的,执行列更新的顺序确实很重要。MySQL 文档UPDATE
指出了这一点,指出每个列更新的表达式将按照声明的顺序进行评估,并且它始终使用列的“当前”值:
如果您访问要在表达式中更新的表中的列,则
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
更新将使用新设置的foo
in值foo+1
。
值得注意的是,这种行为与 SQL 标准不同,后者表明所有列更新在概念上应该“同时”发生。
顺序在 MySQL 中很重要。此外,您可以执行以下操作:
update test set foo=foo+1, bar=foo+1, foo=bar+1;
顺便说一句,这是另一个有用的特定于 MySQL 的技巧:
insert into test (foo, bar) values ('some text', MD5(foo));
注意 - 对于 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
foo=1, bar=1 无论顺序如何[编辑:在 MS-SQL 中。(显然我的 MySQL 不好)]