UPSERT nghĩa là "insert, hoặc update nếu nó đã tồn tại." PostgreSQL triển khai điều này với INSERT ... ON CONFLICT — insert một row, nhưng nếu nó vi phạm một unique constraint, thì thay vào đó update row đang tồn tại (hoặc không làm gì). Nó xử lý nhu cầu "insert-or-update" phổ biến một cách atomic.
Vấn đề mà UPSERT giải quyết
Bạn muốn insert một row, nhưng nó có thể đã tồn tại (theo một unique key):
❌ một INSERT thông thường sẽ thất bại với lỗi unique-violation nếu nó tồn tại
❌ check-then-insert (SELECT, rồi INSERT hoặc UPDATE) có RACE CONDITION
(một transaction khác có thể insert vào giữa lúc bạn check và insert)
→ ON CONFLICT thực hiện nó một cách atomic trong MỘT statement (không có race condition)
