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)
