作者: hp6p
当主键是由两列组成,子表继承该主键作为可空(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