UPSERT znamená "vlož, nebo aktualizuj, pokud již existuje." PostgreSQL to implementuje pomocí INSERT ... ON CONFLICT — vloží řádek, ale pokud by porušil unique constraint, místo toho aktualizuje existující řádek (nebo neudělá nic). Atomicky řeší běžnou potřebu "vlož nebo aktualizuj".
Problém, který UPSERT řeší
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)
