15

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

一个属性在两个复合主键中。

我应该如何引用公共属性?我只是在下面的两个表中将其作为 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)

);

在此处输入图像描述

上面的sql可以吗??在此先感谢并为劣质图道歉:)

4

3 回答 3

25

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

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

于 2013-05-01T18:07:08.303 回答
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)
);
于 2014-02-10T01:32:51.777 回答
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)
);
于 2018-01-06T14:25:27.037 回答