UPSERT betyr «sett inn, eller oppdater hvis det allerede finnes». PostgreSQL implementerer dette med INSERT ... ON CONFLICT — sett inn en rad, men hvis det ville bryte en unik constraint, oppdater den eksisterende raden i stedet (eller gjør ingenting). Det håndterer det vanlige «sett-inn-eller-oppdater»-behovet atomært.
Problemet UPSERT løser
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)
