UPSERT azt jelenti, hogy "szúrj be, vagy frissítsd, ha már létezik." A PostgreSQL ezt az INSERT ... ON CONFLICT utasítással valósítja meg — szúrj be egy sort, de ha ez megsértene egy egyedi korlátot, akkor frissítsd a meglévő sort (vagy ne csinálj semmit). Atomiasan kezel az általános "beszúrás vagy frissítés" igényt.
Az a probléma, amelyet az UPSERT megold
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)
