2010-10-14 51 views
0

我在很多場合使用過這個查詢,從來沒有問題。我只是想知道當用1個查詢更新10,000行時這是最好的選擇嗎?使用一個查詢優化更新多行

我正在更新並對郵政編碼數據庫進行更改,其中一些可能會變得非常大。

這是我在用更新用戶將始終是相同的時候(把它想象成爲萬加郵政編碼)

UPDATE postalcodes 
SET user = CASE postal 
    WHEN 'M4C 1A1' THEN '1' 
    WHEN 'M4C 1A2' THEN '1' 
    WHEN 'M4C 1A3' THEN '1' 
END 
WHERE postal IN ('M4C 1A1','M4C 1A2','M4C 1A3') 

在所有情況下。

我正確地做這件事還是有更快,最優化的解決方案?謝謝。

+1

您可能需要說明您正在嘗試做什麼。在CASE子句可以用一個簡單的'= 1' – PaulG 2010-10-14 22:06:33

+0

代替的那一刻,我正在尋求賦予POSTALCODES表中知道爲USER的郵政編碼塊的所有權。 示例 - 如果我要給id爲1的用戶提供郵政編碼塊,則需要使用一個查詢來更新表POSTALCODES,其中所有郵政編碼已選爲USER = 1。 – Tim 2010-10-14 22:47:53

+0

希望這可以使感! – Tim 2010-10-14 22:48:10

回答

0

改變當值已經設置您可以優化掉的情況下,讓你不要打擾UPDATEing行並不需要它。

UPDATE postalcodes 
SET user = 1 
WHERE postal IN ('M4C 1A1','M4C 1A2','M4C 1A3') and (user <> 1) 
+0

我要試一試,謝謝你的評論。 – Tim 2010-10-15 16:40:50

+0

我終於有機會嘗試這個查詢了;簡單地說,更清潔,跑得比我使用的還要快。謝謝! 18325行受影響。 (查詢耗時2.1521秒) – Tim 2010-10-17 14:14:16

0

因爲這會影響1000行,所以您可以將其作爲事務處理。

如果在一些事情發生之間,有些更新,有些沒有更新,你必須再次檢查。

如果您使用的事務提交和回滾,這將是安全的,

你可以試試。但數據庫引擎應該是innodb。你必須把它從的MyISAM

http://dev.mysql.com/doc/refman/5.0/en/commit.html