简体   繁体   English

引用复合主键

[英]Referencing a composite primary key

I have two tables, with each table having a composite primary key. 我有两个表,每个表都有一个复合主键。

One attribute is in both composite primary keys. 两个复合主键中都有一个属性。

How am i supposed to reference the common attribute?? 我该如何引用公共属性? Do i just reference it as a FK in both tables as below? 我是否只在两个表中将其作为FK引用如下? The cust_id and flight_id below are each part of the composite key as well and reference primary keys in other tables. 下面的cust_id和flight_id也是复合键的一部分,也是其他表中的引用主键。 (Ignore the third attribute in the erd for the br_flight table as I choose to use a composite key in the end). (忽略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)

);

在此输入图像描述

Would the above sql work?? 上面的sql会工作吗? Thanks in advance and apologies for the shoddy diagram:) 在此先感谢并为伪劣图表道歉:)

Foreign keys have to match the primary/unique key they reference column for column. 外键必须匹配列引用列的主/唯一键。 Since the primary key of BOOKING_REFERENCE is ( REFERENCE_ID , CUST_ID ), that means that the foreign key from BR_FLIGHT to BOOKING_REFERENCE must consist of 2 columns also. 由于BOOKING_REFERENCE的主键是( REFERENCE_IDCUST_ID ),这意味着从BR_FLIGHTBOOKING_REFERENCE的外键也必须由2列组成。 That means you need to add CUST_ID to the BR_FLIGHT table - either that or your BOOKING_REFERENCE primary key is wrong and should just be ( REFERENCE_ID ). 这意味着您需要将CUST_ID添加到BR_FLIGHT表中 - 或者您的BOOKING_REFERENCE主键是错误的并且应该是( REFERENCE_ID )。

That said, it doesn't make sense to have foreign keys defined in both directions as you do. 也就是说,像往常一样在两个方向上定义外键是没有意义的。 The "child" table should reference the "parent" and not vice versa. “子”表应引用“父”,而不是反之。

When you reference composite primary key with a foreign key you must reference the whole key. 使用外键引用复合主键时,必须引用整个键。 In your case you should alter the BR_FLIGHT table and add the CUST_ID column 在您的情况下,您应该更改BR_FLIGHT表并添加CUST_ID列

 ALTER TABLE BR_FLIGHT 

    ADD
       (
        CUST_ID NUMBER(10)NOT NULL
       );

And reference the full key as: 并将完整密钥引用为:

FOREIGN KEY  (REFERENCE_ID, CUST_ID) REFERENCES BOOKING_REFERENCE (REFERENCE_ID, CUST_ID)

Now DDL for BR_FLIGHT table will be: 现在,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)
);

As Tony Andrews pointed out you don't need the foreign part in the BOOKING_REFERENCE table. 正如Tony Andrews所指出的那样,你不需要BOOKING_REFERENCE表中的异物。 It should look like this: 它应该如下所示:

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

Hope this helps 希望这可以帮助

You have to put the UNIQUE restriction: 你必须把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)
);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM