Подтвердить что ты не робот

Нет уникального ограничения соответствия заданным ключам для таблицы

У меня есть определение таблицы 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 

Я не уверен, как это исправить.

4b9b3361

Ответ 1

Я думаю, вы ищете два отдельных внешних ключа:

foreign key (evaluation_date) references date_dimension(id),
foreign key (effective_date) references date_dimension(id)

Ответ 2

Ошибка говорит вам о проблеме: у вас нет уникального ограничения на 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);

Ответ 3

Разве вы просто не хотите создавать две отдельные ссылки внешнего ключа для измерения даты следующим образом:

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)
);