UPSERT significa "inserisci, oppure aggiorna se esiste già". PostgreSQL implementa questo con INSERT ... ON CONFLICT — inserisce una riga, ma se violerebbe un vincolo di unicità, invece aggiorna la riga esistente (oppure non fa nulla). Gestisce l'esigenza comune di "inserisci-o-aggiorna" in modo atomico.
Perché è importante
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)
