DBAtlas · Атлас эксплуатации баз данных

40002: transaction_integrity_constraint_violation

PostgreSQL

Что это значит?

Код стандарта SQL для нарушения при COMMIT ограничения целостности, проверяемого в конце транзакции. Важно: PostgreSQL на практике не выдаёт этот код; нарушения отложенных (DEFERRED) ограничений при COMMIT он возвращает с собственным кодом ограничения: 23503 для внешних ключей, 23505 для уникальности.

Почему возникает?

Внешний ключ или ограничение уникальности, определённое как DEFERRABLE INITIALLY DEFERRED, было временно нарушено на промежуточных шагах транзакции и не исправлено к моменту COMMIT; в PostgreSQL это сообщается как 23503/23505. Например, к этому приводит вставка взаимно ссылающихся строк в неверном порядке без последующего исправления.

Как исправить

Исправьте логику транзакции так, чтобы все отложенные ограничения выполнялись до COMMIT (добавьте недостающие ссылки, устраните конфликты). При необходимости проверьте ограничение заранее внутри транзакции с помощью SET CONSTRAINTS ... IMMEDIATE, чтобы раньше выявить проблемный шаг. Измените порядок вставок/обновлений для взаимных ссылок.

Открыть в DBAtlas →

Ещё по этой СУБД