微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

关于使用复合主键作为外键的问题

如何解决关于使用复合主键作为外键的问题

我已经将组合键用作表Airlines的主键。 我想将该主键用作表Flight的外键。 有了这个,我想要的就是航班

  1. 与航空公司无关
  2. 或者如果是,则需要同时拥有复合键的两列。

以下是表格:

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 举报,一经查实,本站将立刻删除。