#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
withgid
= 1; и нет, таблицаsitios
присутствует только вpublic
схеме.3. Тогда я бы заподозрил коррумпированный индекс
sitios
. ПопробуйREINDEX sitios
.4. Та же самая ошибка возникает после переиндексации
5. Хм, не уверен, что происходит. Единственное , что я могу сейчас придумать, — это создать дублирующуюся таблицу
sitios
likeCREATE TABLE sitios_dup AS SELECT * FROM sitios
, предполагая, что таблица не настолько велика, чтобы создать проблему с производительностью/хранилищем . Затем укажитеanillamientos
на дублирующуюся таблицу, по крайней мере временно, чтобы посмотреть, что произойдет.