2017-08-29 180 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記錄的生命週期內不會改變。