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

Внешний ключ гарантирует, что ссылка из одной таблицы указывает на существующую строку другой. Ошибка бывает двух видов:

  • 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 = '<имя из ошибки>';

Что сделать

  1. При удалении сначала удалить или перепривязать ссылающиеся строки, либо удалять через приложение, которое делает это правильно.
  2. При загрузке данных загружать сначала справочные таблицы, потом ссылающиеся.
  3. Не отключать внешние ключи, чтобы загрузка прошла: битые ссылки потом проявятся ошибками в приложении.