PostgreSQLのSQL文でデータを一括更新する方法と実装例

データベースを扱う中で、特定の条件に基づいてデータを一括更新する必要が生じることはよくあります。
本記事では、PostgreSQLを使用して複雑な条件を満たすデータの更新方法について解説します。
特に、CASE 文を用いた柔軟なデータ更新の方法を実装例とともに紹介します。

シナリオ

以下の要件を満たすSQLクエリを作成します。

  1. テーブル名は example_table とします。
  2. 指定された条件に基づいて、user_idcompany_id をそれぞれ 1122 に更新します。
  3. 別のカラム customer_id を以下の条件に基づいて変更します。
    • customer_id1 の場合は 6 に変更。
    • customer_id2 の場合は 7 に変更。
    • customer_id3 の場合は 8 に変更。
    • customer_id4 の場合は 5 に変更。
  4. ただし、user_id5, 10, 15 のレコードは対象外とします。

実装例

以下に要件を満たすSQLクエリを示します。

UPDATE example_table
SET
    user_id = 11,
    company_id = 22,
    customer_id = CASE
        WHEN customer_id = 1 THEN 6
        WHEN customer_id = 2 THEN 7
        WHEN customer_id = 3 THEN 8
        WHEN customer_id = 4 THEN 5
        ELSE customer_id
    END
WHERE user_id NOT IN (5, 10, 15);

クエリの解説

  1. 更新対象の列を指定する
    • SET 文で user_idcompany_id をそれぞれ固定値に変更しています。
  2. 条件による値の変更
    • CASE 文を使用し、customer_id を条件ごとに異なる値に更新します。
    • ELSE customer_id は、CASE 文の条件に一致しない場合に元の値を保持するためのものです。これがないと、条件に当てはまらない場合に NULL が設定される可能性があります。
  3. 対象外条件を設定する
    • WHERE 文で、user_id5, 10, 15 のレコードを更新対象から除外しています。

注意点

  • バックアップの取得
    • データ更新クエリを実行する前に、必ずバックアップを取得してください。
      誤ったクエリを実行するとデータが失われる可能性があります。
  • トランザクションの利用
    • 更新が失敗した場合にロールバックできるよう、トランザクションを使用することを推奨します。
BEGIN;

UPDATE example_table
SET
    user_id = 11,
    company_id = 22,
    customer_id = CASE
        WHEN customer_id = 1 THEN 6
        WHEN customer_id = 2 THEN 7
        WHEN customer_id = 3 THEN 8
        WHEN customer_id = 4 THEN 5
        ELSE customer_id
    END
WHERE user_id NOT IN (5, 10, 15);

-- 更新内容を確認
SELECT * FROM example_table WHERE user_id = 11;

-- 問題がなければコミット
COMMIT;

-- 問題があればロールバック
-- ROLLBACK;

まとめ

PostgreSQLUPDATE文は、柔軟性が高く、条件付きでデータを一括更新する際に非常に便利です。
特に、CASE 文を活用することで複雑な条件を簡潔に記述できます。
システム開発やデータメンテナンスの際には、この手法を活用して効率的に作業を進めましょう。

問題解決や効率化に役立つ他のテクニックについても随時紹介していきますので、ぜひ参考にしてください!


Amazonベストセラー

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA