2013-02-28 48 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 
    ) 

这确保了参考表只扫描一样,因为它是必要的。