UPSERT znači "umetnuti, ili ažurirati ako već postoji." PostgreSQL to implementira s INSERT ... ON CONFLICT — umetni red, ali ako bi narušio ograničenje jedinstvnosti, umjesto toga ažuriraj postojeći red (ili ne radi ništa). To rješava česta potreba "umetnuti-ili-ažurirati" atomski.
Problem koji UPSERT rješava
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)
