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

4

4 回答 4

2

在严格的更新性能方面不会有太大变化。必须找到并更新具有给定 ID 的所有行。

可以简化您的通话的一件事是使用in关键字。它是这样的:

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

我还建议确保 ID 的顺序与 id 上的索引建议的顺序相同,可能是升序。

于 2013-02-28T10:49:08.547 回答
2

把你的身份证放在一张桌子上。然后做这样的事情:

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

或者,如果您的 id 的来源是其他查询,请使用该查询来获取您要更新的 id。

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

对于基于另一个表的更复杂的更新案例,这个问题给出了一个很好的例子。

于 2013-02-28T10:51:32.627 回答
0

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

还要对您的 id 字段进行索引,这样您将获得更好的性能。

于 2013-02-28T10:53:49.823 回答
0

值得注意的是,如果您确实按照@dan1111 的建议引用了一张表格,请不要使用in (select ..),当然要避免使用distinct!相反,使用exists-

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

这确保了仅在需要时扫描参考表。

于 2016-04-21T18:41:26.310 回答