UPSERT significa "inserir ou atualizar se já existe". PostgreSQL implementa isso com INSERT ... ON CONFLICT — insere uma linha, mas se violasse uma restrição única, ao invés disso atualiza a linha existente (ou não faz nada). Ele trata a necessidade comum de "inserir ou atualizar" atomicamente.
O problema que UPSERT resolve
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)
