Вопрос:
У меня есть определение таблицы date_dimension:
CREATE TABLE date_dimension ( id integer primary key, date text, year double precision, year_for_week double precision, quarter double precision );
Я пытаюсь создать таблицу fact, которая терпит неудачу
create table fact ( id serial primary key, contract integer, component integer, evaluation_date integer, effective_date integer, foreign key (evaluation_date, effective_date) references date_dimension(id, id) );
Ошибка:
ERROR: there is no unique constraint matching given keys for referenced table «date_dimension» SQL state: 42830
Я не уверен, как это исправить.
Лучший ответ:
Я думаю, вы ищете два отдельных внешних ключа:
foreign key (evaluation_date) references date_dimension(id), foreign key (effective_date) references date_dimension(id) Ответ №1
Ошибка говорит вам о проблеме: у вас нет уникального ограничения на date_dimension, которое соответствует вашему ограничению внешнего ключа.
Однако это приводит к большей проблеме с дизайном: отношения с внешним ключом не имеют никакого смысла.
Вы могли бы решить свою “проблему” с помощью
CREATE UNIQUE INDEX date_dimension(id,id);
Но это тупое, потому что id всегда одно и то же. Он также может быть выражен как:
FOREIGN KEY (evaluation_date) REFERENCES date_dimension(id);
Затем избавиться от столбца effective_date, который всегда будет идентичен evaluation_date в вашем примере.
Или… вы, вероятно, действительно хотите два отношения FK:
FOREIGN KEY (evaluation_date) REFERENCES date_dimension(id); FOREIGN KEY (effective_date) REFERENCES date_dimension(id); Ответ №2
Разве вы просто не хотите создавать две отдельные ссылки внешнего ключа для измерения даты следующим образом:
create table fact ( id serial primary key, contract integer, component integer, evaluation_date integer, effective_date integer, foreign key (evaluation_date) references date_dimension(id), foreign key (effective_date) references date_dimension(id) );