如果由两个列共同组成主键而且一个子表将主键作为可为空值的外键来继承就可能得到错误的数据可在一个外键列中插入有效的值但在另一个外键列中插入空值然后可添加一个数据表检查约束在可为空的外键中检查数据的有效性
任何多列外键都可能遇到同样的问题所以你需要添加一个检查约束来检测异常最初检查约束将检查构成外键的所有列中可能为空的值检查约束还要检查这些列中不能为空的值如两个检查都通过问题就解决了
以下示范脚本展示了这样的一个异常以及如何用检查约束来纠正它
SET NOCOUNT ONGOCREATE TABLE parent (pkey INT IDENTITY NOT NULL pkey INT
NOT NULL col INT NULLCONSTRAINT pk_parent PRIMARY KEY NONCLUSTERED ( pkey pkey))GOINSERT parent (pkey) VALUES ( )INSERT parent (pkey) VALUES ( )INSERT parent (pkey) VALUES ( )INSERT parent (pkey) VALUES ( )GOSELECT * FROM parentGOCREATE TABLE child (cpkey INT IDENTITY NOT NULLCONSTRAINT pk_child PRIMARY KEY NONCLUSTERED (cpkey)pkey INT NULL pkey INT NULL col INT NULLCONSTRAINT fk_parent_child FOREIGN KEY (pkey pkey)REFERENCES parent (pkey pkey))GOINSERT child (pkey pkey) VALUES ( null )GOSELECT * FROM childGODELETE childGOALTER TABLE child WITH NOCHECKADD CONSTRAINT ck_fk_parent_child CHECK((pkey IS NOT NULL AND pkey IS NOT NULL) OR(pkey IS NULL AND pkey IS NULL) )GOINSERT child (pkey pkey) VALUES ( null )GODROP TABLE child parentGO
空值是所有数据库开发者和管理员都要遇到的所以要想开发成功的应用程序必须知道如何处理这些值本文和你分享了空值处理的一些技巧和技术