如何在MySQL中更新冲突值

如何在MySQL中更新冲突值,mysql,Mysql,假设我有一张表,我有下表: Numbers ======= 1 2 2 1 使用MySql(MyISAM),如何将1转换为2,将2转换为1 例如,这将不起作用: UPDATE `MyTable` SET `Numbers` = 1 WHERE `Numbers` = 2; UPDATE `MyTable` SET `Numbers` = 2 WHERE `Numbers` = 1; 第一条语句将在执行第二条语句之前将所有2转换为1。结果将是: Numbers ====

假设我有一张表,我有下表:

Numbers
=======
   1
   2
   2
   1
使用MySql(MyISAM),如何将1转换为2,将2转换为1

例如,这将不起作用:

UPDATE `MyTable` SET `Numbers` = 1 WHERE `Numbers` = 2;
UPDATE `MyTable` SET `Numbers` = 2 WHERE `Numbers` = 1;
第一条语句将在执行第二条语句之前将所有2转换为1。结果将是:

Numbers
=======
   2
   2
   2
   2  
我需要的是:

Numbers
=======
   2
   1
   1
   2
是否可以只使用MySQL

UPDATE MyTable
SET Numbers = CASE Numbers
                WHEN 1 THEN 2
                WHEN 2 then 1
              END
WHERE Numbers IN (1, 2)

第一个版本更容易推广到多种情况


第一个版本更容易推广到多种情况。

我擅长调用sql而不是更改它,但这可能会奏效。。。问题是您正在执行两个不同的语句,您需要如何组合它们

 UPDATE `MyTable` SET `Numbers` = 1 WHERE `Numbers` = 2 
 and if `Numbers` = 2 WHERE `Numbers` = 1;

我擅长调用sql而不是更改它,但这可能会起作用。。。问题是您正在执行两个不同的语句,您需要如何组合它们

 UPDATE `MyTable` SET `Numbers` = 1 WHERE `Numbers` = 2 
 and if `Numbers` = 2 WHERE `Numbers` = 1;

谢谢你,巴尔马。是否有必要在第一版中包含“在(1,2)中的数字”?包含它只是为了通过缩小记录集来提高性能吗?如果不这样做,我认为它会将所有其他数字设置为
NULL
,除非将
其他数字
添加到
大小写
表达式中。它还应该提高性能,因为它不必对所有不相关的行执行
CASE
测试。@Steven George:由于该CASE表达式将在WHEN中不匹配的行返回NULL,因此它将更新表中的所有行,并用NULL替换除1或2以外的值。(我有时会因为在CASE表达式中包含
ELSE NULL
而受到惩罚,但它确实存在,即使没有指定它。)要删除WHERE子句,我们需要在CASE表达式中使用
ELSE number
。不要无意中更改其他行是最重要的。使用WHERE子句还可以提高性能。谢谢大家,谢谢巴尔马。是否有必要在第一版中包含“在(1,2)中的数字”?包含它只是为了通过缩小记录集来提高性能吗?如果不这样做,我认为它会将所有其他数字设置为
NULL
,除非将
其他数字
添加到
大小写
表达式中。它还应该提高性能,因为它不必对所有不相关的行执行
CASE
测试。@Steven George:由于该CASE表达式将在WHEN中不匹配的行返回NULL,因此它将更新表中的所有行,并用NULL替换除1或2以外的值。(我有时会因为在CASE表达式中包含
ELSE NULL
而受到惩罚,但它确实存在,即使没有指定它。)要删除WHERE子句,我们需要在CASE表达式中使用
ELSE number
。不要无意中更改其他行是最重要的。使用WHERE子句还可以提高性能。谢谢大家。
 UPDATE `MyTable` SET `Numbers` = 1 WHERE `Numbers` = 2 
 and if `Numbers` = 2 WHERE `Numbers` = 1;