2012-02-20 99 views
10

與MySQL我使用這個查詢:MYSQL更新集在同一列,但與多個WHERE子句

UPDATE CustomerDetails_COPY 
SET Category_ID = 10 
WHERE Category_ID = 2 

那很好,但我想廣告15+更SET/WHERE之如:

UPDATE CustomerDetails_COPY 
SET Category_ID = 9 WHERE Category_ID = 3 
SET Category_ID = 12 WHERE Category_ID = 4 
SET Category_ID = 11 WHERE Category_ID = 5 
..... 

我該怎麼補充?

編輯:

按獵人建議:

UPDATE CustomerDetails_COPY 
    SET Category_ID = CASE Category_ID 
     WHEN 2 THEN 10 
     WHEN 3 THEN 9 
     WHEN 4 THEN 12 
     WHEN 5 THEN 11 
    END 
WHERE Category_ID IN (2,3,4,5) 

這個偉大的工程!由於

回答

13

像這樣的東西應該爲你工作:

UPDATE CustomerDetails_COPY 
    SET Category_ID = CASE Category_ID 
     WHEN 2 THEN 10 
     WHEN 3 THEN 9 
     WHEN 4 THEN 12 
     WHEN 5 THEN 11 
    END 
WHERE Category_ID IN (2,3,4,5) 

另外,西蒙建議,你可以這樣做,從輸入值的兩倍保存:

UPDATE CustomerDetails_COPY 
    SET Category_ID = CASE Category_ID 
     WHEN 2 THEN 10 
     WHEN 3 THEN 9 
     WHEN 4 THEN 12 
     WHEN 5 THEN 11 
     ELSE Category_ID 
    END 

來源:http://www.karlrixon.co.uk/writing/update-multiple-rows-with-different-values-and-a-single-sql-query/

+1

刪除我的評論作爲嘗試這個和工作,很好:)作爲一個說明,你可以添加「ELSE Category_ID」之前「結束」,如果你不想包括在哪裏 – 2012-02-20 21:27:12

+0

謝謝。好點;它可以節省兩次進入列的時間。 – 2012-02-20 21:29:28

+2

使用'WHERE'子句,您幾乎可以確保能夠使用Category_ID上的索引,也可以使用[safe-updates](http://dev.mysql.com/doc/refman/5.0/zh/) mysql-command-options.html#option_mysql_safe-updates)啓用後,您必須輸入帶'UPDATE'的WHERE子句,所以'ELSE'子句可能不是最佳選擇。堅持'WHERE'。 – 2012-02-20 21:39:47

2

做到這一點的典型方法是

UPDATE CustomerDetails_COPY SET Category_ID = 10 WHERE Category_ID = 2 
UPDATE CustomerDetails_COPY SET Category_ID = 9 WHERE Category_ID = 3 
UPDATE CustomerDetails_COPY SET Category_ID = 12 WHERE Category_ID = 4 
UPDATE CustomerDetails_COPY SET Category_ID = 11 WHERE Category_ID = 5 

有你避免這種方法的原因嗎?

category_ID的新值和舊值之間是否有任何關聯?

+0

我有超過300個不同類型:( – Monty 2012-02-20 21:21:43

+0

爲什麼那能改變什麼?這是一次性查詢,對嗎?因此,請使用您計算機的複製/粘貼功能並製作一天。除非這些新價值與某些OLD價值衝突。那麼你可能需要一個臨時表或獵人的解決方案 – JohnFx 2012-02-20 21:22:57

+0

大多數不同,但有些是相同的。 – Monty 2012-02-20 21:28:29

1

你可以創建另一個表,在其中進行映射。如:

map_table 
----------- 
mani_id 
new_id 

然後填寫它...

然後

UPDATE CustomerDetails_Copy set category_id = (select new_id from map_table where mani_id = category_id)