引用一个复合主键(Referencing a composite primary key)

2019-09-01 15:30发布

我有两个表,与具有复合主键的每个表。

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

我应该如何引用共同属性? 我刚才提到它作为一个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)

);

将上面的SQL工作? 在此先感谢和道歉的伪劣图:)

Answer 1:

外键必须匹配他们为列引用列主/唯一键。 由于主键BOOKING_REFERENCE是( REFERENCE_IDCUST_ID ),这意味着,从所述外键BR_FLIGHTBOOKING_REFERENCE也必须由2列。 这意味着你需要添加CUST_IDBR_FLIGHT表-要么或您的BOOKING_REFERENCE主键是错误的,应该只是( REFERENCE_ID )。

这就是说,它没有任何意义有两个方向定义的外键为你做。 “子”表应引用“父”,而不是相反。



Answer 2:

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

希望这可以帮助



Answer 3:

你必须把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)
);


文章来源: Referencing a composite primary key