我复制了以下段落 http://msdn.microsoft.com/en-us/library/ms175464(v=sql.105).aspx
FOREIGN KEY约束可以包含空值;但是,如果有的话 复合FOREIGN KEY约束的列包含空值, 验证构成FOREIGN KEY约束的所有值是 跳过。确保复合FOREIGN KEY的所有值 验证约束,在所有参与者上指定NOT NULL 列。
有人能为我提供一个简单的例子来帮助我理解上述内容吗?外键约束会做什么验证?我认为这与参照完整性有关。
非常感谢。
答案 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
值,因此会跳过验证。