如何解决关于使用复合主键作为外键的问题
我已经将组合键用作表Airlines的主键。 我想将该主键用作表Flight的外键。 有了这个,我想要的就是航班
- 与航空公司无关
- 或者如果是,则需要同时拥有复合键的两列。
以下是表格:
CREATE TABLE Airlines (
name char(32),country char(32),PRIMARY KEY (name,country)
);
CREATE TABLE Flights_operate (
num integer PRIMARY KEY,dept timestamp,arr timestamp,name_Airlines char(32),country_Airlines char(32),CONSTRAINT FK
FOREIGN KEY (name_Airlines,country_Airlines) REFERENCES Airlines (name,country)
);
我尝试使用CONSTRAINT
,但似乎无法解决问题。
我仍然可以插入带有name_Airlines
而没有country_Airlines
的行,如下所示:
image
我该怎么办?
解决方法
要禁止外键中的仅一列为空,可以使用MATCH FULL(请参阅docs)。
CREATE TABLE Flights_operate (
num integer PRIMARY KEY,dept timestamp,arr timestamp,name_Airlines char(32),country_Airlines char(32),CONSTRAINT FK
FOREIGN KEY (name_Airlines,country_Airlines)
REFERENCES Airlines (name,country) MATCH FULL
);
,
您也可以使用check
约束来做到这一点:
CREATE TABLE Flights_operate (
num integer PRIMARY KEY,country_Airlines) REFERENCES Airlines (name,country),CHECK (name_Airlines IS NOT NULL AND country_Airlines IS NOT NULL OR
name_Airlines IS NULL AND country_Airlines IS NULL
)
);
一些附加说明。
首先,请勿将char
用作名称的数据类型。它用空格填充字符串,这通常是不希望的。
第二,考虑为所有表使用一个身份/序列主键。这比字符串更有效-整数要考虑4个字节,而复合键要考虑64个字节。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。