9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

概要

緊急対応などで、大量のデータ補正を一気にやる必要が出たときに、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生成の流れ

  1. スプレッドシートをCSVでエクスポート
    例: update_data.csv(id, status)
  2. CSVをSQLのVALUES句に変換
    Excelの関数やPythonスクリプトで
    (1, 'active'),
    (2, 'inactive'),
    ...
    
    の形に整形
  3. 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生成も可能
9
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?