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)
