原文:Sql Server 2008R2版本中有关外键Foreign的使用

1. 在数据库设计的过程中往往会想让2张表进行关联而使用到Foreign从而加强2张表之间的约束(如图)

Sql Server 2008R2版本中有关外键Foreign的使用-LMLPHP

以前有个问题一直没弄明白,那就是外键列的值的情况,正常情况下表中的列的值可以是null或者满足该列所定义的类型的数据即可,但是外键是不是也一样呢?

答案显然不是的,那到底是个什么情况呢?

官方帮助文档是这样说明的“FOREIGN KEY 约束并不仅仅可以与另一表的 PRIMARY KEY 约束相链接,它还可以定义为引用另一表的 UNIQUE 约束。FOREIGN KEY 约束可以包含空值,但是,如果任何组合 FOREIGN KEY 约束的列包含空值,则将跳过组成 FOREIGN KEY 约束的所有值的验证。”


2. 为了验证官方的说法,特意测试了一下,正所谓“实验是检验真理的唯一标准”

首先往UserType表里面插入一条数据--insert UserType(Id,TypeName,CreateDateTime,ModifyDateTime) values(NEWID(),'系统管理员',GETDATE(),GETDATE())

第一次我往UserInfo(从表)中也插入一条数据如图,但是这里的外键UserTypeId我没有给值,但是数据插入成功了。Sql Server 2008R2版本中有关外键Foreign的使用-LMLPHP

第二次插入(如图)Sql Server 2008R2版本中有关外键Foreign的使用-LMLPHP

这里面外键我给了一个“满足类型”的值,结果插入失败

最后一次插入(如图)

Sql Server 2008R2版本中有关外键Foreign的使用-LMLPHP

OK插入成功!

3. 最好在借用官方的一句话“FOREIGN KEY 约束可以包含空值,但是,如果任何组合 FOREIGN KEY 约束的列包含空值,则将跳过组成 FOREIGN KEY 约束的所有值的验证”。

05-08 15:32