UPSERT σημαίνει "εισαγωγή, ή ενημέρωση αν υπάρχει ήδη." Η PostgreSQL υλοποιεί αυτό με INSERT ... ON CONFLICT — εισάγει μια σειρά, αλλά αν θα παραβίαζε έναν περιορισμό μοναδικότητας, αντ' αυτού ενημερώνει την υπάρχουσα σειρά (ή δεν κάνει τίποτα). Χειρίζεται ατομικά την κοινή ανάγκη "εισαγωγή-ή-ενημέρωση".
Το πρόβλημα που λύνει το UPSERT
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)
