2013-02-28 46 views
0

我想更新多行。我有很多指定要更新哪一行的id(大約12k個id)。更新許多特定行上的相同數據

什麼是最好的方法來實現這一目標?

我知道我可以做

UPDATE table SET col="value" WHERE id = 1 OR id = 24 OR id = 27 OR id = ....repeatx10000 

但我想,這將使糟糕的表現,對不對?那麼是否有更好的方式來指定更新哪些ID?

Postgresql版本是9.1

回答

2

在嚴格的更新性能方面沒有太大的改變。所有具有給定ID的行都必須找到並更新。

有一件事情可能會簡化你的電話,使用in關鍵字。它是這樣的:

UPDATE table SET col="value" WHERE id in (1,24,27, ...);

我還建議確保該ID是在同一順序喜歡上了ID的指數顯示,很可能上升。

2

將你的ID放在一個表中。然後做這樣的事情:

UPDATE table SET col="value" WHERE id in (select id from table_of_ids_to_update) 

或者,如果你的IDS的來源是一些其他的查詢,使用查詢獲取要更新的ID。

UPDATE table SET col="value" WHERE id in (
     select distinct id from some_other_table 
      where some_condition_for_updating is true 
      ... etc. ... 
    ) 

對於更復雜的基於另一個表進行更新的情況,this question給出了一個很好的例子。

0

UPDATE table SET col =「value」WHERE id in(select id from table);

也使您的id字段索引,你會得到更好的表現。

+0

默認情況下,主鍵被索引。 – Dariusz 2013-02-28 10:58:37

+0

如果它是主鍵那麼它沒關係 – 2013-02-28 12:24:31

0

值得一提的是,如果你做參考表作爲@ dan1111建議,不要使用in (select ..),當然避免distinct!相反,使用exists -

update table 
set col = value 
where exists (
     select from other_table 
     where other_table.id = table.id 
    ) 

這確保了參考表只掃描一樣,因爲它是必要的。