UPSERT reiškia „įterpti arba atnaujinti, jei jau egzistuoja“. PostgreSQL tai įgyvendina su INSERT ... ON CONFLICT — įterpiama eilutė, bet jei tai pažeistų unikalumo apribojimą (unique constraint), vietoj to atnaujinama esama eilutė (arba nedaroma nieko). Taip atomiškai patenkinamas dažnas „įterpti arba atnaujinti“ poreikis.
Problema, kurią sprendžia 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)
