引用复合主键

时间:2013-05-01 18:01:15

标签: sql oracle foreign-keys primary-key composite-primary-key

我有两个表,每个表都有一个复合主键。

两个复合主键中都有一个属性。

我该如何引用公共属性?我是否只在两个表中将其作为FK引用如下?下面的cust_id和flight_id也是复合键的一部分,也是其他表中的引用主键。 (忽略br_flight表的erd中的第三个属性,因为我选择最后使用复合键)。

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会工作吗? 在此先感谢并为劣质图表道歉:)

3 个答案:

答案 0 :(得分:15)

外键必须与列引用列的主/唯一键匹配。由于BOOKING_REFERENCE的主键是(REFERENCE_IDCUST_ID),这意味着从BR_FLIGHTBOOKING_REFERENCE的外键也必须包含2列。这意味着您需要将CUST_ID添加到BR_FLIGHT表格中 - 或者您的BOOKING_REFERENCE主键错误且应该是(REFERENCE_ID)。

也就是说,像你一样在两个方向上定义外键是没有意义的。 “子”表应引用“父”,反之亦然。

答案 1 :(得分:8)

使用外键引用复合主键时,必须引用整个键。在您的情况下,您应该更改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安德斯指出你不需要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)
);

希望这有帮助

答案 2 :(得分:1)

您必须设置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)
);