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)
