引用复合主键

19

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

其中一个属性在两个复合主键中都出现。

我应该如何引用这个共同的属性?我只需要在两个表中都将其作为外键引用吗?如下所示,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)

);

在此输入图片描述

上面的 SQL 语句有效吗?感谢您的帮助并为糟糕的图表表示歉意。:)


10
你需要使用三脚架或更快的快门速度来拍摄那张照片。 - PinnyM
3个回答

28

外键必须与它们所引用的主/唯一键逐列匹配。由于BOOKING_REFERENCE的主键是(REFERENCE_IDCUST_ID),这意味着从BR_FLIGHTBOOKING_REFERENCE的外键也必须由两个列组成。这意味着您需要将CUST_ID添加到BR_FLIGHT表中,或者您的BOOKING_REFERENCE主键有误,应该只是(REFERENCE_ID)。

话虽如此,你的双向定义外键并没有意义。 "子"表应该引用 "父"表而不是反过来。


13

当您使用外键引用复合主键时,必须引用整个主键。在您的情况下,您应该修改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)
);

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接