UPSERT berarti "insert, atau update jika sudah ada." PostgreSQL mengimplementasikan ini dengan INSERT ... ON CONFLICT — insert sebuah baris, tetapi jika melanggar unique constraint, update baris yang sudah ada (atau tidak lakukan apa-apa). Ini menangani kebutuhan umum "insert-atau-update" secara atomic.
Masalah yang UPSERT selesaikan
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)
