40002: transaction_integrity_constraint_violation
PostgreSQLO que significa?
O código do padrão SQL para a violação, no COMMIT, de uma constraint de integridade verificada no fim da transação. Importante: na prática, o PostgreSQL não produz este código; ele retorna as violações de constraints adiadas (DEFERRED) no COMMIT com o próprio código da constraint: 23503 para foreign keys, 23505 para unicidade.
Por que acontece?
Uma foreign key ou constraint unique definida como DEFERRABLE INITIALLY DEFERRED foi temporariamente violada em etapas intermediárias da transação e não foi corrigida até o COMMIT; no PostgreSQL, isso é informado como 23503/23505. Por exemplo, inserir linhas que se referenciam mutuamente na ordem errada sem corrigi-las causa isso.
Como resolver
Corrija a lógica da transação para que todas as constraints adiadas sejam satisfeitas antes do COMMIT (adicione as referências ausentes, resolva os conflitos). Se necessário, verifique a constraint mais cedo dentro da transação com SET CONSTRAINTS ... IMMEDIATE para detectar antes a etapa problemática. Reordene os inserts/updates em casos de referências mútuas.