PostgreSQLでCONFLICT(MERGE・UPSERT)を利用する方法

データベース,SQL データベース
データベース

本記事では、PostgreSQLでON CONFLICTを使用して、特定のキーに基づいたデータの挿入と更新を行う方法について詳しく解説します。

これは、他のデータベースでMERGEと呼ばれる機能に類似しています。

サンプルコードとその実行結果も紹介しながら、実際の使い方を理解していただける内容となっています。

ON CONFLICTとは?

ON CONFLICTは、PostgreSQLのINSERT文で使用されるオプションです。

指定したキーがすでに存在する場合、そのレコードを更新し、存在しない場合には新規に挿入する動作を行います。

これは、MERGE文と同等の機能を提供しており、データベース操作を効率化するために非常に便利です。

MERGEとの違い

PostgreSQLにはMERGEという専用の文は存在しませんが、ON CONFLICTを使うことで、同じ動作を実現できます。

違いとしてはMERGEがより多様な条件下での更新や挿入を行えるのに対し、ON CONFLICTは主にキーの衝突に対処する目的で設計されています。

ON CONFLICTの基本構文

ON CONFLICTを使用した基本的なSQL構文は以下のようになります。

INSERT INTO テーブル名 (カラム1, カラム2, ...) VALUES (値1, 値2, ...)
    ON CONFLICT (キー)
    DO UPDATE SET カラム = 値;

ここで、ON CONFLICTの後に指定するキーは一意性制約や主キーの列を指します。

この構文により、もし挿入しようとしているレコードがすでに存在している場合には、更新を行い、存在しない場合には新規レコードを挿入します。

基本的な例

例えば、ユーザー情報を管理するテーブルがある場合、すでに存在するユーザーがいれば更新し、いなければ新規に挿入するSQLは次のようになります。

INSERT INTO users (id, name, email) VALUES (1, 'Taro', 'taro@example.com')
    ON CONFLICT (id)
    DO UPDATE SET name = EXCLUDED.name, email = EXCLUDED.email;

この例では、id列が一意制約を持っており、同じidのレコードが存在する場合には、nameとemail列が更新されます。

EXCLUDEDの役割

EXCLUDEDは、ON CONFLICT句内で使用される特殊なキーワードです。

これは、衝突が発生した際に挿入されなかった行を参照するために使われます。

これにより、衝突が発生したレコードのデータを取得して更新操作に利用できます。

実際のサンプルSQLと実行結果

ここでは、PostgreSQLでON CONFLICTを用いた実際のサンプルSQLとその実行結果を紹介します。

テーブル作成

まず、次のSQLでサンプル用のテーブルを作成します。

CREATE TABLE users (
        id SERIAL PRIMARY KEY,
        name VARCHAR(100),
        email VARCHAR(100) UNIQUE
);

データ挿入と更新のサンプル

それでは、データを挿入し、ON CONFLICTを利用して既存のレコードを更新してみましょう。

-- 新しいユーザーを挿入
    INSERT INTO users (name, email) VALUES ('Hanako', 'hanako@example.com');

-- ID 1のユーザーが既に存在する場合、メールアドレスを更新
    INSERT INTO users (id, name, email) VALUES (1, 'Taro', 'taro_new@example.com')
    ON CONFLICT (id)
    DO UPDATE SET email = EXCLUDED.email;

このSQLを実行すると、最初の挿入では新規ユーザーHanakoが追加され、次の挿入ではID 1に対応するTaroのメールアドレスが更新されます。

これにより、レコードが適切に挿入または更新されたことが確認できます。

INSERT 0 1は1行が挿入または更新されたことを意味しています。

まとめ

本記事では、PostgreSQLのON CONFLICTを利用したMERGE操作に相当する処理を解説しました。

ON CONFLICTを使うことで、重複するレコードの処理を簡素化できるため、効率的なデータ管理が可能です。

サンプルSQLと実行結果を通して、基本的な使用方法を理解していただけたと思います。EXCLUDEDを使用することで、衝突が発生したレコードの値を柔軟に扱うことができるため、様々な場面で活用できます。

データベース運用において、ON CONFLICTは非常に強力なツールですので、ぜひ実践に役立ててください。

タイトルとURLをコピーしました