40002: transaction_integrity_constraint_violation
PostgreSQL¿Qué significa?
Código del estándar SQL para la infracción en COMMIT de una restricción de integridad comprobada al final de la transacción. Importante: PostgreSQL no produce este código en la práctica; devuelve las infracciones de restricciones diferidas (DEFERRED) en COMMIT con el código propio de la restricción: 23503 para foreign keys, 23505 para unicidad.
¿Por qué ocurre?
Una foreign key o restricción única definida DEFERRABLE INITIALLY DEFERRED se rompió temporalmente en pasos intermedios de la transacción y no se corrigió antes del COMMIT; en PostgreSQL se informa como 23503/23505. Por ejemplo, insertar filas que se referencian mutuamente en el orden incorrecto sin corregirlas provoca esto.
Cómo solucionarlo
Corrija la lógica de la transacción para que todas las restricciones diferidas se cumplan antes del COMMIT (añada las referencias que faltan, resuelva los conflictos). Si es necesario, compruebe la restricción antes dentro de la transacción con SET CONSTRAINTS ... IMMEDIATE para detectar antes el paso problemático. Reordene las inserciones/actualizaciones en caso de referencias mutuas.