2013-10-26 34 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值。