UPSERT tarkoittaa "lisää, tai päivitä jos se on jo olemassa". PostgreSQL toteuttaa tämän komennolla INSERT ... ON CONFLICT — lisää rivi, mutta jos se rikkoisi yksilöllisyysrajoitetta (unique constraint), päivitä sen sijaan olemassa oleva rivi (tai älä tee mitään). Se hoitaa yleisen "lisää-tai-päivitä"-tarpeen atomisesti.
Ongelma, jonka UPSERT ratkaisee
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)
