概要
緊急対応などで、大量のデータ補正を一気にやる必要が出たときに、PostgreSQLで複数レコードを一度に個別値で更新する方法をまとめます。
「id, 新しい値」などのデータをスプレッドシートなどで管理しており、それを活用してSQLに落とし込むところまでを解説します。
1. 基本方針
- スプレッドシートのデータをCSVでエクスポート
- CSVデータをSQLの
VALUES
句に変換 -
UPDATE ... FROM
構文で一括更新
2. SQL例
たとえば、users
テーブルのstatus
カラムをidごとに個別値で更新したい場合:
UPDATE users AS u
SET status = v.status
FROM (
VALUES
(1, 'active'),
(2, 'inactive'),
(3, 'pending')
-- ...
) AS v(id, status)
WHERE u.id = v.id;
3. スプレッドシート→SQL生成の流れ
-
スプレッドシートをCSVでエクスポート
例:update_data.csv
(id, status) -
CSVをSQLのVALUES句に変換
Excelの関数やPythonスクリプトでの形に整形(1, 'active'), (2, 'inactive'), ...
-
SQLを作成して実行
上記のUPDATE ... FROM
構文に貼り付け
4. PythonでSQL生成例
import pandas as pd
df = pd.read_csv('update_data.csv')
values = ',\n'.join([f"({row['id']}, '{row['status']}')" for _, row in df.iterrows()])
sql = f"""
UPDATE users AS u
SET status = v.status
FROM (
VALUES
{values}
) AS v(id, status)
WHERE u.id = v.id;
"""
print(sql)
5. 注意点
- 数千件程度ならこの方法で問題ありません(PostgreSQLのクエリ長制限にも通常は収まります)。
- 他のカラムも更新したい場合は、
VALUES
句とSET
句にカラムを追加してください。 - クエリが非常に長くなる場合は、分割して実行するか、一時テーブルを使う方法も検討できます。
6. まとめ
- スプレッドシート→CSV→SQLのVALUES句→UPDATE ... FROM の流れが一番手軽
- 1クエリで個別値を一括更新できる
- 自動化したい場合はPythonなどでSQL生成も可能