UPDATE文でLIMITやORDERが使えないPostgreSQLで指定した件数だけUPDATEする方法

  • 2020.03.11
  • SQL
UPDATE文でLIMITやORDERが使えないPostgreSQLで指定した件数だけUPDATEする方法

PostgreSQLでは、MySQLとは違いUPDATE文にLIMITやORDERを付けることができない。 そのため、あるテーブルから指定した件数のレコードを更新するには、UPDATEとSELECTを組み合わせて書く必要がある。

Advertisement

指定した件数だけUPDATEする方法

指定した件数だけを更新するには以下のように、SELECTでIDを指定した件数分取得し、それらを更新する。

構文

UPDATE <テーブル名> SET <更新内容> WHERE id in (SELECT id FROM <テーブル名> LIMIT <件数>);

記述例

UPDATE counter SET count = count + 1 WHERE id in (SELECT id FROM counter LIMIT 3);
UPDATE member SET score = 0, flag = true WHERE id in (SELECT id FROM member WHERE flag = false LIMIT 2);

この場合、取り出された順に指定された件数のレコードが更新されるので、どのデータが更新されるかはわからない。

id順に指定した件数のデータを更新する例

以下のようにORDERを付けることでidの小さな方から順に指定した件数のデータを更新することができる。

UPDATE counter SET count = count + 1 WHERE id in (SELECT id FROM counter ORDER BY id LIMIT 3);
UPDATE member SET score = 0, flag = true WHERE id in (SELECT id FROM member WHERE flag = false ORDER BY id LIMIT 2);

ランダムに選択されたレコードを更新する例

ランダムに選択されたレコードを更新したい場合には以下のように書くことができる。

UPDATE counter SET count = count + 1 WHERE id in (SELECT id FROM counter ORDER BY random() LIMIT 3);
UPDATE member SET score = 0, flag = true WHERE id in (SELECT id FROM member WHERE flag = false ORDER BY random() LIMIT 2);

ちなみに、このSQLはMySQLでも使えそうに見えるが、MySQLでは更新するテーブルとサブクエリ内のFROMで同じテーブルを指定することができない問題や、INを使ったサブクエリ内でのLIMITがサポートされていない問題などにより、MySQLでは使うことができない。

Advertisement