Ответ 1
Я думаю, вы ищете два отдельных внешних ключа:
foreign key (evaluation_date) references date_dimension(id),
foreign key (effective_date) references date_dimension(id)
У меня есть определение таблицы 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)
Ошибка говорит вам о проблеме: у вас нет уникального ограничения на 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);
Разве вы просто не хотите создавать две отдельные ссылки внешнего ключа для измерения даты следующим образом:
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)
);