外键是否始终引用主键?

时间:2017-08-29 05:22:56

标签: oracle foreign-keys data-modeling

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

由于

2 个答案:

答案 0 :(得分:2)

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

你当然可以在同一个表中有2个或更多个FK,它们指的是相同的PK或UK。这模拟了子记录与多个父记录相关的关系 - 例如代表生物学孩子的记录可能会为他们的父亲以及他们的母亲记录FK。

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

答案 1 :(得分:1)

  

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

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

例如,任何形式的体育比赛都有相同类型的对手 - 玩家,团队等。因此匹配将有该实体的两个实例,因此子表将有两列,外键引用相同的主要键。

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记录的生命周期内发生变化。