sql - primary - 外鍵是否可以是NULL和/或重複的?




sql foreign key用法 (6)

1 - 是的,至少從SQL Server 2000開始。

2 - 是的,只要它不是UNIQUE約束或鏈接到唯一索引。

請為我澄清兩件事情:

  1. 外鍵是否可以為NULL?
  2. 外鍵可以重複嗎?

就我所知, NULL不應該用於外鍵,但在我的一些應用程序中,我可以在Oracle和SQL Server中輸入NULL ,但我不知道為什麼。


以下是使用Oracle語法的示例:
首先讓我們創建一個COUNTRY表

CREATE TABLE TBL_COUNTRY ( COUNTRY_ID VARCHAR2 (50) NOT NULL ) ;
ALTER TABLE TBL_COUNTRY ADD CONSTRAINT COUNTRY_PK PRIMARY KEY ( COUNTRY_ID ) ;

創建表格省份

CREATE TABLE TBL_PROVINCE(
PROVINCE_ID VARCHAR2 (50) NOT NULL ,
COUNTRY_ID  VARCHAR2 (50)
);
ALTER TABLE TBL_PROVINCE ADD CONSTRAINT PROVINCE_PK PRIMARY KEY ( PROVINCE_ID ) ;
ALTER TABLE TBL_PROVINCE ADD CONSTRAINT PROVINCE_COUNTRY_FK FOREIGN KEY ( COUNTRY_ID ) REFERENCES TBL_COUNTRY ( COUNTRY_ID ) ;

這在Oracle中運行得非常好。 注意第二個表中的COUNTRY_ID外鍵沒有“NOT NULL”。

現在要將一行插入到PROVINCE表中,只需指定PROVINCE_ID就足夠了。 但是,如果您還選擇指定COUNTRY_ID,則它必須已存在於COUNTRY表中。


我認為一個表的外鍵也是其他表的主鍵,所以它不會允許null。所以不存在在外鍵中有空值的問題。


我認為考慮表格中可能的基數會更好。 我們可以有可能的最小基數為零。 如果它是可選的,那麼來自相關表的元組的最小參與可以為零,現在你面臨允許外鍵值被允許為null的必要性。

但答案是全部取決於業務。


簡答:是的,它可以是NULL或重複。

我想解釋為什麼外鍵可能需要為空或可能需要唯一或不唯一。 首先記住一個外鍵只需要該字段中的值必須首先存在於不同的表(父表)中。 這就是所有FK的定義。 根據定義,空值不是一個值。 空意味著我們還不知道價值是什麼。

讓我給你一個真實的例子。 假設您有一個存儲銷售建議的數據庫。 進一步假設每個提案只有一個銷售人員和一個客戶。 所以你的提案表會有兩個外鍵,一個是客戶ID,另一個是銷售代表ID。 但是,在創建記錄時,銷售代表並不總是被分配(因為沒有人可以自由處理它),所以客戶ID被填寫,但銷售代表ID可能為空。 換句話說,通常你需要能夠在輸入數據時不知道它的值的情況下擁有一個空FK,但你知道表中需要輸入的其他值。 要允許FK中的空值,通常你只需要在具有FK的字段上允許空值。 空值與作為FK的想法是分開的。

它是唯一的還是不唯一的涉及到該表與父表是否具有一對一或一對多關係。 現在,如果你有一對一的關係,你可能會把所有的數據放在一張表中,但是如果表太寬或者數據是在另一個主題上(僱員保險示例@tbone給出了例如),那麼你需要單獨的表格與FK。 然後你會想讓這個FK或者PK(保證唯一性)或者對它進行獨特的約束。

大多數FK是一對多的關係,這就是你從FK得到的,而不需要在該領域增加進一步的限制。 例如,您有一個訂單表和訂單明細表。 如果客戶一次訂購十件商品,則他有一個訂單和十個訂單明細記錄,其中包含與FK相同的訂單ID。


簡而言之,實體之間的“非識別”關係是ER-Model的一部分,在設計ER-Diagram時可在Microsoft Visio中找到。 這是在“零或大於零”或“零或一”類型的實體之間強制實施基數所必需的。 注意基數中的“零”而不是“一對多”中的“一”。

現在,基數可以是“零”(非識別)的非識別關係的例子是當我們在一個實體中說出記錄/對象時 - “可能”或“可能不”具有作為對記錄的引用的值/ s在另一個實體-B中。

因為,實體-A的一條記錄有可能將自己標識給其他實體-B的記錄,因此在實體-B中應該有一列具有實體-B的記錄的標識值。 如果Entity-A中沒有記錄標識Entity-B中的記錄(或對象),則該列可以是“Null”。

在面向對象(現實世界)範式中,有些情況下,類B的對像不一定依賴於(強耦合)類A的對象的存在,這意味著類B與類對象A這樣A類可以“包含”(包含)類A的對象,而不是類B的對象的概念必須具有(組合)A類的對象,因為它的類(對像類) B)創作。

從SQL查詢角度來看,您可以查詢entity-B中所有記錄為“not null”的記錄,以獲取為Entity-B保留的外鍵。 這將為實體-A中的行帶來具有特定相應值的所有記錄,或者,具有空值的所有記錄將是在實體-B中的實體-A中沒有任何記錄的記錄。







foreign-keys