2

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

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

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

非常感谢。

4

3 回答 3

2

如果您以另一种方式考虑它,则不需要示例。

如果复合外键中的任何字段是,则在提供该键的所有NULL字段之前,不会检查其他字段的完整性。

于 2012-06-04T20:53:12.583 回答
2

就是说,如果您有一个使用下面两列的复合外键,则不会强制执行该关系(因为 NameNULL用于 OtherId 2)。

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

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

于 2012-06-04T20:54:06.470 回答
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值,所以会跳过验证。

于 2012-06-04T20:53:03.263 回答