检查可空外键

ZDNet软件频道 时间:2002-08-22 作者:hp6p |  我要评论()
本文关键词:外键 约束 NULLABLE
当主键是由两列组成,子表继承该主键作为可空(NULLABLE)外键有一个继承该主关键字作为无效外来关键字的子表,在这些数据当中很可能包含无效的错误的数据。

当主键是由两列组成,子表继承该主键作为可空(NULLABLE外键有一个继承该主关键字作为无效外来关键字的子表,在这些数据当中很可能包含无效的错误的数据。你可以向一个外键列插入有效值,并且向另外的外键列输入空,添加表约束检查可空外键的数据合法性。

这种情况会在任何的多列外键中发生。如果这个外键由两个或者更多的列组成,那么,就更有可能发生这种情况。你需要添加检查条件来测试该异常情况。最初,检查条件会检查所有列中的可空值,包含了外键。它还会检查其中的非空值。如果这两个检查都被通过,那么,该情况就不会发生。

下面所列的就是一个程序范例。这个程序范例向我们展示了出现该情况并将其解决的过程。


SET NOCOUNT ON
GO
CREATE TABLE parent (pkey1 INT IDENTITY NOT NULL, pkey2 INT NOT NULL, col1 INT NULL,
CONSTRAINT pk_parent PRIMARY KEY NONCLUSTERED ( pkey1, pkey2))
GO
INSERT parent (pkey2) VALUES ( 2 )
INSERT parent (pkey2) VALUES ( 85 )
INSERT parent (pkey2) VALUES ( 41 )
INSERT parent (pkey2) VALUES ( 11 )
GO
SELECT * FROM parent
GO
CREATE TABLE child (cpkey1 INT IDENTITY NOT NULL
CONSTRAINT pk_child PRIMARY KEY NONCLUSTERED (cpkey1),
pkey1 INT NULL, pkey2 INT NULL, col1 INT NULL,
CONSTRAINT fk_parent_child FOREIGN KEY (pkey1, pkey2)
REFERENCES parent (pkey1, pkey2))
GO
INSERT child (pkey1, pkey2) VALUES ( null, 85 )
GO
SELECT * FROM child
GO
DELETE child
GO
ALTER TABLE child WITH NOCHECK
ADD CONSTRAINT ck_fk_parent_child CHECK
( (pkey1 IS NOT NULL AND pkey2 IS NOT NULL) OR
(pkey1 IS NULL AND pkey2 IS NULL) )
GO
INSERT child (pkey1, pkey2) VALUES ( null, 11 )
GO
DROP TABLE child, parent
GO


责任编辑:小李(EMAIL:li_shuangzhen@zdnet.com.cn


欢迎评论或投稿


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134