web-dev-qa-db-ja.com

複合主キーの参照

2つのテーブルがあり、各テーブルには複合主キーがあります。

1つの属性は、両方の複合主キーにあります。

共通の属性をどのように参照する必要がありますか?以下のように、両方の表でFKとして参照していますか?以下のcust_idとflight_idはそれぞれ複合キーの一部であり、他のテーブルの主キーを参照しています。 (最後に複合キーを使用することを選択したため、br_flightテーブルのerdの3番目の属性は無視してください)。

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は機能しますか?事前に感謝し、見苦しい図をお詫びします:)

8
Daniel o Keeffe

外部キーは、列の列を参照する主キー/一意キーと一致する必要があります。 BOOKING_REFERENCEの主キーは(REFERENCE_IDCUST_ID)であるため、BR_FLIGHTからBOOKING_REFERENCEへの外部キーも2列で構成されている必要があります。つまり、CUST_IDBR_FLIGHTテーブルに追加する必要があります。それまたはBOOKING_REFERENCE主キーが間違っているため、(REFERENCE_ID)である必要があります。

とはいえ、外部キーを両方向に定義することは意味がありません。 「子」テーブルは「親」を参照する必要があり、その逆はできません。

16
Tony Andrews

複合主キーを外部キーで参照する場合は、キー全体を参照する必要があります。あなたの場合、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)

これで、BR_FLIGHTテーブルのDDLは次のようになります。

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

Tony Andrewsが指摘したように、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)
);

お役に立てれば

8
Milica Medic

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)
);
1
Freddy Reyes