KDOC 581: アトミックなupsertを実行する

この文書のステータス

  • 作成
    • 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クエリにフォールバックするときがある。

関連

なし。

Backlinks