SQL. Как ссылаться на составной первичный ключ Oracle?

У меня есть две родительские таблицы: « Treatment и Visit .

Таблица лечения:

  create table Treatment ( TreatCode CHAR(6) constraint cTreatCodeNN not null, Name VARCHAR2(20), constraint cTreatCodePK primary key (TreatCode), ); 

Посетите таблицу:

 create table Visit ( SlotNum NUMBER(2), DateVisit DATE, ActualArrivalTime DATE, constraint cVisitSlotDatePK primary key (SlotNum, DateVisit) ); 

Теперь я пытаюсь создать дочернюю таблицу:

 create table Visit_Treat ( TreatCode constraint cTreatCodeFK references Treatment(TreatCode), SlotNum constraint cSlotNumFK references Visit(SlotNum), DateVisit constraint cDateFK references Visit(DateVisit), constraint cVisitTreatPK primary key (SlotNum, TreatCode, DateVisit) ); 

Все работает отлично до 3-х линий. Начиная с 3-й строки, т. SlotNum constraint ... появляется сообщение: no matching unique or primary key . Уже был аналогичный вопрос , но я не совсем понял логику в моем случае. Я ссылаюсь на каждый столбец один за другим, и он работает для родительского стола « Treatment . Как мне исправить ссылку родительского стола?

  CONSTRAINT fk_column FOREIGN KEY (column1, column2, ... column_n) REFERENCES parent_table (column1, column2, ... column_n) 

в твоем случае

 create table Visit_Treat ( TreatCode CHAR(6) constraint cTreatCodeFK references Treatment(TreatCode), SlotNum NUMBER(2), DateVisit DATE, constraint cVisitTreatPK primary key (SlotNum, TreatCode, DateVisit), constraint fk_slotnumDatevisit FOREIGN KEY(SlotNum,DateVisit) references Visit(SlotNum,DateVisit) ); 

Внешний ключ должен ссылаться на первичный ключ родительской таблицы – весь первичный ключ. В вашем случае основным ключом таблицы Visit является SlotNum, DateVisit но внешний ключ из Visit_Treat только на SlotNum .

У вас есть два хороших варианта:

  1. Добавьте столбец DateVisit в Visit_Treat и Visit_Treat внешний ключ в SlotNum, DateVisit , ссылаясь на SlotNum, DateVisit in Visit .

  2. Создайте нерабочий первичный ключ для Visit (например, столбец с именем VisitID типа NUMBER , VisitID последовательностью), добавьте столбец Visit_Treat в Visit_Treat и сделайте этот внешний ключ.

И два плохих варианта:

  1. Измените первичный ключ Visit чтобы быть только SlotNum так что ваш внешний ключ Visit_Treat будет работать. Это, вероятно, не то, что вы хотите.

  2. Не используйте внешний ключ. Я не рекомендую этот вариант. Если у вас возникли проблемы с настройкой внешнего ключа, который, как вы знаете, должен существовать, это обычно означает проблему с дизайном.