当主键是由两列组成,子表继承该主键作为可空(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)
欢迎评论或投稿