【问题标题】:Issue on using composite primary key as a foreign key使用复合主键作为外键的问题
【发布时间】:2020-10-07 04:19:43
【问题描述】:

我创建了一个复合键作为表 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

我该怎么办?

【问题讨论】:

标签: sql postgresql foreign-keys sql-insert


【解决方案1】:

要禁止外键中的一列为空,您可以使用 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
);

【讨论】:

    【解决方案2】:

    您也可以使用check 约束来做到这一点:

    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),
      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 字节的复合键。

    【讨论】:

      猜你喜欢
      • 2021-10-03
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      • 2021-07-24
      • 2016-08-21
      • 1970-01-01
      • 1970-01-01
      • 2012-01-27
      相关资源
      最近更新 更多