UPSERT bermaksud "sisip, atau kemas kini jika ia sudah wujud." PostgreSQL melaksanakannya dengan INSERT ... ON CONFLICT — sisip satu baris, tetapi jika ia akan melanggar kekangan unik, sebaliknya kemas kini baris sedia ada (atau tidak buat apa-apa). Ia mengendalikan keperluan "sisip-atau-kemas kini" yang lazim secara atomik.
Masalah yang diselesaikan 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)
