在同一语句中复制和更新Mysql
我知道这很有效,但这是一种好的做法吗在同一语句中复制和更新Mysql,mysql,Mysql,我知道这很有效,但这是一种好的做法吗 update test set field1=field1+field2, field2=0; 我不想将field2设置为0,直到将值添加到field1总计中。这会一直按计划工作吗?在手册()中找到了它: 更新t1集合col1=col1+1,col2=col1 单表更新分配通常从左到右进行计算 正确的。对于多个表更新,不能保证 作业按任何特定顺序进行 因此,它将始终工作如果MySQL遵循标准,它应该工作。但在这种情况下,它没有(遵循标准)。注意。在标准IS
update test set field1=field1+field2, field2=0;
我不想将field2
设置为0
,直到将值添加到field1
总计中。这会一直按计划工作吗?在手册()中找到了它:
更新t1集合col1=col1+1,col2=col1代码>
单表更新分配通常从左到右进行计算
正确的。对于多个表更新,不能保证
作业按任何特定顺序进行
因此,它将始终工作如果MySQL遵循标准,它应该工作。但在这种情况下,它没有(遵循标准)。注意。在标准ISO?ANSI SQL中,这些语句是等效的,并在表中产生相同的更改。(任何人都可以在SQL Server或Oracle中试用。我认为第三种变体只适用于Postgres):
因此,在MySQL中,您的语句在大多数情况下都会像您预期的那样工作,如下所示:
单个表UPDATE
分配通常从左到右进行评估。对于多个表更新,不能保证按任何特定顺序执行分配
但请注意“一般”。100%确定的是,您可以在2条语句(在事务内部)中执行更新:
或者使用一个临时表。我认为没有理由不工作,因为语句的set
部分是从左到右计算的。。。但为了确保这一点,我将把它分成两个update
语句,并尽可能将它们放入一个事务中(只有在两个更新都成功后才提交),这将按预期工作-假设我读对了。您可能需要添加WHERE field2!=0
这样它就不会擦除任何以前修改过的条目。“通常”不是“始终”@eggyal的同义词:否,按照标准,field2
的先前值将用于field1+field2
计算,只有到那时才会应用0
。
UPDATE test
SET field1 = field1 + field2, field2 = 0 ;
UPDATE test
SET field2 = 0, field1 = field1 + field2 ;
UPDATE test
SET (field1, field2) = (field1 + field2, 0) ;
UPDATE test
SET field1 = field1 + field2 ;
UPDATE test
SET field2 = 0 ;