UPSERT は「挿入、またはすでに存在していれば更新」を意味します。PostgreSQL はこれを INSERT ... ON CONFLICT で実装しています — 行を挿入しますが、ユニーク制約に違反する場合は、代わりに既存の行を更新します(または何もしません)。これは一般的な「挿入または更新」の必要性をアトミックに処理します。
UPSERT が解決する問題
You want to insert a row, but it might already exist (by a unique key):
❌ a plain INSERT fails with a unique-violation error if it exists
❌ check-then-insert (SELECT, then INSERT or UPDATE) has a RACE CONDITION
(another transaction could insert between your check and insert)
→ ON CONFLICT does it atomically in ONE statement (no race condition)
