Dan*_*ffe 10 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)
);
Run Code Online (Sandbox Code Playgroud)

上面的sql会工作吗?在此先感谢并为伪劣图表道歉:)
Ton*_*ews 18
外键必须匹配列引用列的主/唯一键.由于主键BOOKING_REFERENCE是(REFERENCE_ID,CUST_ID),这意味着来自的外键BR_FLIGHT也BOOKING_REFERENCE必须由2列组成.这意味着您需要添加CUST_ID到BR_FLIGHT表中 - 或者您的BOOKING_REFERENCE主键是错误的,应该只是(REFERENCE_ID).
也就是说,像往常一样在两个方向上定义外键是没有意义的."子"表应引用"父",而不是反之.
使用外键引用复合主键时,必须引用整个键.在您的情况下,您应该更改BR_FLIGHT表并添加CUST_ID列
ALTER TABLE BR_FLIGHT
ADD
(
CUST_ID NUMBER(10)NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
并将完整密钥引用为:
FOREIGN KEY (REFERENCE_ID, CUST_ID) REFERENCES BOOKING_REFERENCE (REFERENCE_ID, CUST_ID)
Run Code Online (Sandbox Code Playgroud)
现在,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)
);
Run Code Online (Sandbox Code Playgroud)
正如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)
);
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助