外键中的null值

时间:2012-06-04 20:43:41

标签: sql sql-server null foreign-keys referential-integrity

我复制了以下段落 http://msdn.microsoft.com/en-us/library/ms175464(v=sql.105).aspx

  

FOREIGN KEY约束可以包含空值;但是,如果有的话   复合FOREIGN KEY约束的列包含空值,   验证构成FOREIGN KEY约束的所有值是   跳过。确保复合FOREIGN KEY的所有值   验证约束,在所有参与者上指定NOT NULL   列。

有人能为我提供一个简单的例子来帮助我理解上述内容吗?外键约束会做什么验证?我认为这与参照完整性有关。

非常感谢。

3 个答案:

答案 0 :(得分:2)

如果你以另一种方式想到它,你不应该需要一个例子。

如果复合外键中的任何字段为NULL,那么在密钥的所有字段之前,都不会检查其他字段的完整性提供。

答案 1 :(得分:2)

如果您使用下面两列的复合外键,则不会强制执行该关系(因为对于OtherId 2,名称为NULL。)

OtherId  Name
-------  -------
1        Abe
2        NULL
3        Jim
4        Bob

由于未强制执行关系,因此无法强制实施参照完整性。如果您指定两个列都不能具有空值,那么您将永远不会遇到这种情况,并且将保持参照完整性。

答案 2 :(得分:1)

以下是一个例子:

create table t1 (id1 int, id2 int,
    constraint PK_T1 primary key (id1, id2))
create table t2 (id1 int, id2 int)

insert t2 values (1,null)

alter table t2 add constraint FK_T2_T1 foreign key (id1, id2) references t1(id1, id2)

最后一行应该会导致错误。毕竟,t1为空,因此t2中的单行无法引用任何内容。但由于其中一列包含null值,因此会跳过验证。