2017-08-29 133 views
0

我对此有点困惑。外键总是必须引用一个主键?如果在同一张表上有两个引用相同主键的外键会怎么样?外键是否总是引用主键?

由于

+0

你可以给我们一个你真的需要这个表的例子吗? –

回答

2

一组列,其包括在一个表的外键必须是指等效的一组列的表中的任一与主键或唯一键约束。

您肯定可以在同一个表中引用相同的PK或UK的2个或更多个FK。这建立了儿童记录与多于一个父记录相关的关系 - 例如,代表生物学孩子的记录可能会有FK记录给他们的父亲以及他们的母亲。

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

0

“如果有上指的是相同的主键相同的表中的两个外键? ”

任意数量的子表可以参考父表。在某些情况下,子表可能在同一个父项上拥有多个外键。例如,任何形式的体育比赛都有相同类型的对手 - 球员,球队等等。因此,一场比赛我将拥有该实体的两个实例,所以子表将具有两列,其中外键引用相同的主键。

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记录的生命周期内不会改变。