我知道这有效,但这是好的做法吗?
update test set field1=field1+field2, field2=0;
我不希望将field2
设置为0
,直到将值添加到field1
总计。这总是按计划运作吗?
答案 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分配通常从左到右进行评估 对。对于多表更新,无法保证 作业按任何特定顺序进行。
因此它将始终有效