KDOC 581: PostgreSQLのアトミックなupsertはON CONFLICTで書く
この文書のステータス
- 作成
- 2026-06-28 貴島
- レビュー
- 2026-06-28 貴島
概要
DBレベルのアトミックな upsert は、PostgreSQLでは ON CONFLICT を用いてこのように書く。
INSERT INTO users (email, name)
VALUES ('user@example.com', 'admin')
ON CONFLICT (email) DO UPDATE SET name = 'admin';
2クエリ SELECT + (INSERT or UPDATE) にするなどでアトミックでなくなると、同時に実行したときに両方とも INSERT してしまうことになり安全ではない。
ORMにあるような upsert はこのクエリを発行することが多いが、同じテーブル限定などの使用条件があり、2クエリにフォールバックするときがある。
関連
抽象。
- 確認してから書き込む2段階の処理は、同時に実行すると競合する
関連。
なし。