Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在同一语句中复制和更新Mysql_Mysql - Fatal编程技术网

在同一语句中复制和更新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 ;