23001: restrict_violation
PostgreSQLЧто это значит?
Код restrict_violation стандарта SQL. Важно: PostgreSQL сообщает о нарушении внешнего ключа, определённого с ON DELETE/ON UPDATE RESTRICT или NO ACTION, не этим кодом, а кодом 23503 (foreign_key_violation); на практике вы не увидите этот код от ядра PostgreSQL.
Почему возникает?
При удалении родительской строки, имеющей зависимые дочерние строки, или изменении её ключа PostgreSQL возвращает 23503. 23001 обычно встречается в коде приложения, перенесённом с другой базы данных, или как пользовательская ошибка расширения. В отличие от NO ACTION, RESTRICT не может отложить проверку до конца транзакции и завершается ошибкой немедленно.
Как исправить
Сначала удалите/обновите зависимые дочерние строки или перенесите их к другому родителю; затем обработайте родительскую строку. Если бизнес-правило позволяет, рассмотрите переопределение внешнего ключа с ON DELETE CASCADE или SET NULL. При массовых удалениях соблюдайте правильный порядок удаления (сначала дочерние, затем родительские).