2014-02-23 25 views
0
更新衝突值

說我有一個我有如下表:如何在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 
======= 
    2 
    2 
    2 
    2 

我需要的是這樣的:

Numbers 
======= 
    2 
    1 
    1 
    2 

只使用MySQL是有可能嗎?

回答

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

UPDATE MyTable 
SET Numbers = IF(Numbers = 1, 2, 1) 
WHERE Numbers iN (1, 2) 

UPDATE MyTable 
SET Numbers = 3 - Numbers 
WHERE Numbers iN (1, 2) 

第一個版本可以推廣到多種情況下更容易。

+0

感謝Barmar。是否有必要在第一個版本中包含「WHERE Numbers IN(1,2)」?您是否僅僅通過縮小記錄集來提高性能? –

+2

如果你不這樣做,我認爲它會將所有其他數字設置爲'NULL',除非你在'CASE'表達式中添加了'ELSE Numbers'。它還應該提高性能,因爲它不必爲所有不相關的行執行「CASE」測試。 – Barmar

+1

@Steven George:由於CASE表達式將在WHEN中沒有匹配的行返回NULL,它將更新表中的所有行,並用NULL替換1或2以外的值。 (我有時因爲在我的CASE表達式中包含'ELSE NULL'而受到嚴厲批評,但它在那裏,即使它沒有被指定。)要刪除WHERE子句,我們希望在CASE表達式中有一個'ELSE Numbers'。不會無意中更改其他行是最重要的。使用WHERE子句也可以提高性能。 – spencer7593

0

我擅長調用SQL不改變它,但是這可能工作......問題是,你是執行兩個不同的語句,你需要給他們一些如何結合..

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