4

У меня есть две таблицы, каждая таблица имеет составной первичный ключ.Ссылка на составной первичный ключ

Один атрибут находится в обоих составных первичных ключах.

Как я могу ссылаться на общий атрибут ?? Я просто ссылаюсь на него как на FK в обе таблицы, как показано ниже? Ниже перечислены cust_id и flight_id, каждая часть составного ключа, а также ссылки первичных ключей в других таблицах. (Игнорируйте третий атрибут в erd для таблицы br_flight, поскольку я выбираю использовать составной ключ в конце).

CREATE TABLE BOOKING_REFERENCE (
REFERENCE_ID NVARCHAR(10) NOT NULL, 
CUST_ID NUMBER(10)NOT NULL, 
STATUS NVARCHAR (1), NOT NULL, 
PRIMARY KEY(REFERENCE_ID, CUST_ID), 
FOREIGN KEY(REFERENCE_ID) REFERENCES BR_FLIGHT(REFERENCE_ID): 
FOREIGN KEY (CUST_ID) REFERENCES CUSTOMER(CUST_ID); 


CREATE TABLE BR_FLIGHT (
REFERENCE_ID NVARCHAR(10) NOT NULL , 
FLIGHT_ID NVARCHAR (10) NOT NULL, 
PRIMARY KEY(REFERENCE_ID, FLIGHT_ID), 
FOREIGN KEY (REFERENCE_ID) REFERENCES BOOKING_REFERENCE(REFERENCE_ID) 
FOREIGN KEY (FLIGHT_ID) REFERENCES FLIGHT(FLIGHT_ID) 

); 

enter image description here

бы выше SqL работу ?? Заранее благодарим и приносим извинения за дурную диаграмму :)

+0

Вы собираетесь нужно использовать штатив или более короткую выдержку для этого выстрел ... – PinnyM

ответ

11

Внешние ключи должны совпадать с основным/уникальным ключом, которым они ссылаются на столбец. Поскольку первичный ключ BOOKING_REFERENCE (REFERENCE_ID, CUST_ID), это означает, что внешний ключ от BR_FLIGHT до BOOKING_REFERENCE также должен состоять из 2 столбцов. Это означает, что вам нужно добавить CUST_ID в таблицу BR_FLIGHT - либо это или ваш первичный ключ неправильный и должен быть просто (REFERENCE_ID).

При этом не имеет смысла иметь внешние ключи, определенные в обоих направлениях, как вы. Таблица «child» должна ссылаться на «родительский», а не наоборот.

5

Когда вы ссылаетесь на составной первичный ключ с внешним ключом, вы должны ссылаться на весь ключ. В вашем случае вы должны изменить таблицу BR_FLIGHT и добавьте столбец CUST_ID

ALTER TABLE BR_FLIGHT 

    ADD 
     (
     CUST_ID NUMBER(10)NOT NULL 
     ); 

и ссылки на полный ключ, как:

FOREIGN KEY (REFERENCE_ID, CUST_ID) REFERENCES BOOKING_REFERENCE (REFERENCE_ID, CUST_ID) 

Теперь DDL для BR_FLIGHT стола будет:

CREATE TABLE BR_FLIGHT (
REFERENCE_ID NVARCHAR(10) NOT NULL , 
CUST_ID NUMBER(10)NOT NULL, 
FLIGHT_ID NVARCHAR (10) NOT NULL, 
PRIMARY KEY(REFERENCE_ID, FLIGHT_ID), 
FOREIGN KEY (REFERENCE_ID, CUST_ID) REFERENCES BOOKING_REFERENCE (REFERENCE_ID, CUST_ID) 
); 

Как указал Тони Эндрюс, вам не нужна чужая часть в таблице BOOKING_REFERENCE. Он должен выглядеть следующим образом:

CREATE TABLE BOOKING_REFERENCE (
REFERENCE_ID NVARCHAR(10) NOT NULL, 
CUST_ID NUMBER(10)NOT NULL, 
STATUS NVARCHAR (1), NOT NULL, 
PRIMARY KEY(REFERENCE_ID, CUST_ID) 
); 

Надеется, что это помогает

0

Вы должны поставить UNIQUE ограничения:

CREATE TABLE BOOKING_REFERENCE (
REFERENCE_ID NVARCHAR(10) NOT NULL UNIQUE, 
CUST_ID NUMBER(10)NOT NULL, 
STATUS NVARCHAR (1), NOT NULL, 
PRIMARY KEY(REFERENCE_ID, CUST_ID), 
FOREIGN KEY(REFERENCE_ID) REFERENCES BR_FLIGHT(REFERENCE_ID): 
FOREIGN KEY (CUST_ID) REFERENCES CUSTOMER(CUST_ID); 


CREATE TABLE BR_FLIGHT (
REFERENCE_ID NVARCHAR(10) NOT NULL , 
FLIGHT_ID NVARCHAR (10) NOT NULL, 
PRIMARY KEY(REFERENCE_ID, FLIGHT_ID), 
FOREIGN KEY (REFERENCE_ID) REFERENCES BOOKING_REFERENCE(REFERENCE_ID) 
FOREIGN KEY (FLIGHT_ID) REFERENCES FLIGHT(FLIGHT_ID) 
); 
Смежные вопросы