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段階の処理は、同時に実行すると競合する

関連。

なし。

Backlinks