Mysql复制和更新在同一声明中

时间:2013-04-30 15:17:40

标签: mysql

我知道这有效,但这是好的做法吗?

update test set field1=field1+field2, field2=0;

我不希望将field2设置为0,直到将值添加到field1总计。这总是按计划运作吗?

2 个答案:

答案 0 :(得分:2)

如果MySQL遵循标准,它应该有效。但在这种情况下,它没有(遵循标准)。注意。在标准ISO?ANSI SQL中,这些语句是等效的,并在表中产生相同的更改。 (任何人都可以在SQL-Server或Oracle中尝试它们。第3种变体只在Postgres中起作用我认为):

UPDATE test 
SET field1 = field1 + field2, field2 = 0 ;

UPDATE test 
SET field2 = 0, field1 = field1 + field2 ;

UPDATE test 
SET (field1, field2) = (field1 + field2, 0) ;

因此,在MySQL中,您的语句将像大多数时候一样工作,如MySQL documentation所述:

  

单表UPDATE作业从左到右进行一般评估。对于多表更新,无法保证以任何特定顺序执行分配。

请注意“general”。为了100%确定,您可以在2个语句中进行更新(在事务内):

UPDATE test 
SET field1 = field1 + field2 ;

UPDATE test 
SET field2 = 0 ;

或使用临时表。

答案 1 :(得分:0)

在手册(http://dev.mysql.com/doc/refman/5.0/en/update.html)中找到了它:

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

  

单表UPDATE分配通常从左到右进行评估   对。对于多表更新,无法保证   作业按任何特定顺序进行。

因此它将始终有效