Главная / Справочник ошибок / PostgreSQL
Удаление или изменение ломает ссылку из другой таблицы
ERROR: update or delete on table violates foreign key constraint
«ERROR: update or delete on table "..." violates foreign key constraint "..." on table "..."» и «insert or update violates foreign key constraint» (SQLSTATE 23503) в PostgreSQL: на запись ссылаются, или ссылка ведёт в пустоту. Как найти ссылающиеся строки.
Что это значит
Внешний ключ гарантирует, что ссылка из одной таблицы указывает на существующую строку другой. Ошибка бывает двух видов:
update or delete on table A violates foreign key constraint ... on table B: удаляют или меняют строку в A, а на неё ссылаются строки в B;insert or update on table B violates foreign key constraint: в B пишут ссылку на строку A, которой нет.
В строке DETAIL указан конкретный ключ: Key (id)=(1043) is still referenced from table "b".
Как проверить
Найти, кто ссылается на строку:
SELECT * FROM b WHERE a_id = 1043;
Имена столбцов внешнего ключа можно посмотреть так:
SELECT conname, pg_get_constraintdef(oid) FROM pg_constraint WHERE conname = '<имя из ошибки>';
Что сделать
- При удалении сначала удалить или перепривязать ссылающиеся строки, либо удалять через приложение, которое делает это правильно.
- При загрузке данных загружать сначала справочные таблицы, потом ссылающиеся.
- Не отключать внешние ключи, чтобы загрузка прошла: битые ссылки потом проявятся ошибками в приложении.
Ошибка повторяется?
Запустите Диагностика: за полминуты он покажет состояние базы, брокера, поиска и сервера. С отчётом разберём причину за 30 минут бесплатного созвона.
Написать