首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >引用复合主键

引用复合主键
EN

Stack Overflow用户
提问于 2013-05-02 02:01:15
回答 3查看 47.9K关注 0票数 14

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

两个复合主键中都有一个属性。

我应该如何引用公共属性??我是否只在下面两个表中将其引用为FK?下面的cust_id和flight_id也是组合键的一部分,并引用其他表中的主键。(忽略br_flight表的erd中的第三个属性,因为我最后选择使用组合键)。

代码语言:javascript
复制
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可以工作吗??提前感谢并为粗制滥造的图表道歉:)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-02 02:07:08

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

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

票数 24
EN

Stack Overflow用户

发布于 2014-02-10 09:32:52

当使用外键引用复合主键时,必须引用整个键。在您的示例中,您应该更改BR_FLIGHT表并添加CUST_ID列

代码语言:javascript
复制
 ALTER TABLE BR_FLIGHT 
  
    ADD
       (
        CUST_ID NUMBER(10)NOT NULL
       );

并将完整密钥引用为:

代码语言:javascript
复制
FOREIGN KEY  (REFERENCE_ID, CUST_ID) REFERENCES BOOKING_REFERENCE (REFERENCE_ID, CUST_ID)

现在,BR_FLIGHT表的DDL将是:

代码语言:javascript
复制
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表中的外来部分。它应该看起来像这样:

代码语言:javascript
复制
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)
);
票数 13
EN

Stack Overflow用户

发布于 2018-01-06 22:25:27

您必须设置UNIQUE限制:

代码语言:javascript
复制
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)
);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16323676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档