Как исправить эту ошибку при создании внешнего ключа в PostgreSQL?

#postgresql #foreign-keys

Вопрос:

У меня есть две таблицы в базе данных PostgreSQL:

 CREATE TABLE anillamientos
(gbifid integer NOT NULL,
specieskey integer,
localidad integer)
 

и

 CREATE TABLE sitios
(gid integer NOT NULL DEFAULT nextval('sitios_gid_seq'::regclass),
nombre character varying(150) COLLATE pg_catalog."default",
detalles character varying(100) COLLATE pg_catalog."default",
CONSTRAINT sitios_pkey PRIMARY KEY (gid))
 

Я хочу создать внешний ключ в первой таблице, который ссылается на второй в поле gid . Я создал следующий код

 alter table anillamientos 
add constraint fk_anill_sitio 
foreign key (localidad) references sitios(gid);
 

Но он возвращает следующую ошибку

 ERROR:  insert or update on table "anillamientos" violates foreign key constraint "fk_anill_sitio"
DETAIL:  Key (localidad)=(1) is not present in table "sitios".
SQL state: 23503
 

Что это значит? Я проверил, что идентификатор 1 присутствует в обеих таблицах. Почему это не работает и как это можно решить?

Комментарии:

1. Просто для ясности, sitios там есть строка с gid 1? Присутствует ли таблица sitios в нескольких схемах? Если да, то возникает search_path проблема, когда FK пытается ссылаться на версию, у которой нет gid 1?

2. Да, есть строка в sitios with gid = 1; и нет, таблица sitios присутствует только в public схеме.

3. Тогда я бы заподозрил коррумпированный индекс sitios . Попробуй REINDEX sitios .

4. Та же самая ошибка возникает после переиндексации

5. Хм, не уверен, что происходит. Единственное , что я могу сейчас придумать, — это создать дублирующуюся таблицу sitios like CREATE TABLE sitios_dup AS SELECT * FROM sitios , предполагая, что таблица не настолько велика, чтобы создать проблему с производительностью/хранилищем . Затем укажите anillamientos на дублирующуюся таблицу, по крайней мере временно, чтобы посмотреть, что произойдет.