【问题标题】:Does a foreign key always refer to a primary key?外键是否总是引用主键?
【发布时间】:2018-02-06 10:40:50
【问题描述】:

我对此有点困惑。外键必须始终引用主键吗?如果同一张表上有两个外键引用同一个主键怎么办?

谢谢

【问题讨论】:

  • 你能给我们一个你实际需要这个表的例子吗?
  • 一个 SQL FK 引用一个 PK 或 UNIQUE。它告诉 DBMS FK 的非空子行必须是引用表中的子行。如果是这样,并且之前的声明没有暗示,请声明它。

标签: oracle foreign-keys data-modeling


【解决方案1】:

在一个表中包含外键的一组列必须引用具有主键或唯一键约束的表中的一组等效列。

您当然可以在同一个表中拥有 2 个或更多 FK,它们引用同一个 PK 或 UK。这对子记录与多个父记录相关的关系建模 - 例如代表亲生子女的记录可能对其父亲和母亲的记录都有 FK。

请注意,唯一索引不足以达到此目的;需要唯一约束,否则您将得到“ORA-02270:此列列表没有匹配的唯一键或主键”。

【讨论】:

    【解决方案2】:

    "如果同一张表上有两个外键引用同一个主键怎么办? "

    任意数量的子表都可以引用父表。在某些情况下,子表可能在同一个父表上具有多个外键。

    例如,任何形式的体育比赛都有相同类型的对手 - 球员、球队等。因此一场比赛将有该实体的两个实例,因此子表将有两列外键引用相同的主键。

    create table player (
        player_id number not null primary key
        , name varchar2(30) not null unique
    );
    create table match (
        match_id number not null primary key
        , player_1 number not null 
        , player_2 number not null 
        , match_played date not null
        , result varchar2(10)
        , constraint match_player1_fk foreign key (player_1) references player
        , constraint match_player2_fk foreign key (player_2) references player
    );
    

    外键可以引用唯一约束而不是主键。然而,这不是标准做法。使用唯一键来强制执行候选键(业务键)是惯例,这些键并不总是适合用作外键。

    例如,在我的示例中,PLAYER.NAME 是唯一键:每个玩家都必须有一个不同的名称。但是,使用NAME 作为MATCH 的外键是不合适的,因为人们可以更改他们的名字。使用合成主键PLAYER_ID 更方便,因为它不会在PLAYER 记录的生命周期内改变。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-01
      • 2022-11-21
      • 2011-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      相关资源
      最近更新 更多