【问题标题】:Update the same data on many specific rows更新许多特定行上的相同数据
【发布时间】:2013-02-14 12:31:04
【问题描述】:

我想更新多行。我有很多 id 指定要更新的行(大约 12k id)。

实现这一目标的最佳方法是什么?

我知道我能做到

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

但我认为这会带来糟糕的表现,对吧?那么有没有更好的方法来指定要更新哪些 id?

Postgresql 版本是 9.1

【问题讨论】:

    标签: sql database postgresql postgresql-9.1


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      将您的 ID 放入表格中。然后做这样的事情:

      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. ...
          )
      

      对于基于另一个表的更复杂的更新情况,this question 给出了一个很好的例子。

      【讨论】:

        【解决方案3】:

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

        同时在您的 id 字段上进行索引,这样您将获得更好的性能。

        【讨论】:

        • 主键默认索引。
        • 如果是主键就可以了
        【解决方案4】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多