UPSERT bedeutet "einfügen, oder aktualisieren, falls es bereits existiert." PostgreSQL implementiert dies mit INSERT ... ON CONFLICT — füge eine Zeile ein, aber falls dies gegen eine Unique-Constraint verstoßen würde, aktualisiere stattdessen die existierende Zeile (oder mache nichts). Es löst das häufige "einfügen-oder-aktualisieren"-Bedürfnis atomar.
Warum es wichtig ist
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)
