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 をテーブルに入れます。次に、次のようにします。

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 に答える
2

厳密な更新パフォーマンスに関しては、あまり変わりません。指定された ID を持つすべての行を見つけて更新する必要があります。

呼び出しを簡素化する 1 つの方法は、inキーワードを使用することです。こんなふうになります:

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

また、ID のインデックスが示唆するように、ID が同じ順序であることを確認することをお勧めします。おそらく昇順です。

于 2013-02-28T10:49:08.547 に答える
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 に答える