2012-10-05 79 views
52

我試圖使用CLI腳本更新一個大型的MyISAM表(2500萬條記錄)。表格沒有被其他任何東西鎖定/使用。MySQL update CASE WHEN/THEN/ELSE

我想,而不是每個記錄做單個UPDATE查詢,我不如利用CASE功能。

id字段是主要的。我懷疑以下查詢應該花費毫秒。

UPDATE `table` SET `uid` = CASE 
    WHEN id = 1 THEN 2952 
    WHEN id = 2 THEN 4925 
    WHEN id = 3 THEN 1592 
    END 

瞧,查詢耗費CPU並且不會永久完成。

然後,令我驚訝的是,我發現查詢正在更新所有2500萬行,將NULL放在我沒有指定的行上。

那是什麼目的?每次執行此查詢時,是否可以對特定行執行MASS更新而不更新2500萬行?或者我必須做個別更新,然後提交?

+2

當你不在'case'語句中指定'else'默認爲'null' –

回答

105

試試這個

UPDATE `table` SET `uid` = CASE 
    WHEN id = 1 THEN 2952 
    WHEN id = 2 THEN 4925 
    WHEN id = 3 THEN 1592 
    ELSE `uid` 
    END 
WHERE id in (1,2,3) 
+1

完全忘記了WHERE ..現在它有道理爲什麼會發生這種情況。謝謝大聲笑。 – nick

5

簡單的將是:

UPDATE `table` SET uid = ELT(id, 2952, 4925, 1592) WHERE id IN (1,2,3) 
4

那是因爲你錯過了別人。 「

」返回第一個條件爲true的結果,如果沒有匹配結果值,則返回ELSE後的結果,如果沒有ELSE部分,則返回NULL。 (http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#operator_case

+0

即使我指定了一個ELSE ..不會嘗試更新其餘的嗎?當我只需要更新時,我仍然不想更新2500萬條記錄。放置WHERE子句可解決問題。 – nick

+0

你可以試試ELSE BEGIN END – alex