40002: transaction_integrity_constraint_violation
PostgreSQLWas bedeutet das?
Der SQL-Standardcode für die Verletzung eines am Transaktionsende geprüften Integritäts-Constraints beim COMMIT. Wichtig: PostgreSQL erzeugt diesen Code in der Praxis nicht; es liefert Verletzungen verzögerter (DEFERRED) Constraints beim COMMIT mit dem eigenen Code des Constraints: 23503 für Foreign Keys, 23505 für Eindeutigkeit.
Ursache
Ein DEFERRABLE INITIALLY DEFERRED definierter Foreign-Key- oder Unique-Constraint wurde in Zwischenschritten der Transaktion vorübergehend verletzt und bis zum COMMIT nicht korrigiert; in PostgreSQL wird das als 23503/23505 gemeldet. Zum Beispiel führt das Einfügen sich gegenseitig referenzierender Zeilen in falscher Reihenfolge ohne anschließende Korrektur dazu.
Lösung
Korrigiere die Transaktionslogik so, dass alle verzögerten Constraints vor dem COMMIT erfüllt sind (fehlende Referenzen ergänzen, Konflikte auflösen). Prüfe den Constraint bei Bedarf früh innerhalb der Transaktion mit SET CONSTRAINTS ... IMMEDIATE, um den problematischen Schritt eher zu erkennen. Ordne Inserts/Updates bei gegenseitigen Referenzen neu.