2013-10-26 67 views
2

是否需要將表中的外鍵列設置爲NOT NULL, 如果我們沒有明確將外鍵列寫爲非空,它會是什麼? 它可以包含空值嗎?是否需要將外鍵作爲非空

什麼是以下兩個語句之間的區別:

[PhoneId] [int] NOT NULL FOREIGN KEY REFERENCES [dbo].[tbl_PhoneNumber](PhoneNumberId) 
[PhoneId] [int] FOREIGN KEY REFERENCES [dbo].[tbl_PhoneNumber](PhoneNumberId) 
+0

區別在於第二個定義將允許列中的空值。第一個關係將是'1 :: 0..n',第二個則是'0..1 :: 0..n'(如果您熟悉這種表示法)。 –

+0

@ypercube - 這取決於ANSI默認數據庫選項以及客戶端庫是否調用['SET ANSI_NULL_DFLT_ON'](http://technet.microsoft.com/en-us/library/ms187375.aspx) –

回答

0

它不是必需的。沒有NOT NULL的外鍵屬性可以包含NULL值,並且這可以用於指示引用關係中沒有這樣的元組適用。

+0

意味着默認情況下,它也可以包含空值! –

+0

@DhananjayPatil: - 是的,它可能包含NULL值! –

5

需要它做外鍵列作爲NOT NULL表,

不,它不是必需的。 MSDN說: -

當非NULL值輸入到一個FOREIGN KEY約束的列,該值必須在被引用的列中存在; 否則,將返回外鍵違例錯誤消息。要確保 確保複合外鍵約束的所有值均爲 已驗證,請在所有參與的列上指定NOT NULL。

所以你的問題的簡單答案是不需要它。

外鍵屬性也可以包含NULL值。

您的第二個定義將允許Nulls列中。

here: -

當一個外鍵約束添加到表中的SQL Server在現有的列或 列,默認情況下將檢查列中的現有數據 ,以確保所有的值,除NULL外,存在於引用的PRIMARY KEY或UNIQUE約束的 列中。

還要檢查Foreign Key Constraints

1

根據SQL規範化規則外鍵值必須等於主鍵值或NULL,那麼它將包含從主鍵錶行一個值任NULL值。