如果由兩個列共同組成主鍵
而且一個子表將主鍵作為可為空值的外鍵來繼承
就可能得到錯誤的數據
可在一個外鍵列中插入有效的值
但在另一個外鍵列中插入空值
然後
可添加一個數據表檢查約束
在可為空的外鍵中檢查數據的有效性
任何多列外鍵都可能遇到同樣的問題
所以
你需要添加一個檢查約束來檢測異常
最初
檢查約束將檢查構成外鍵的所有列中可能為空的值
檢查約束還要檢查這些列中不能為空的值
如兩個檢查都通過
問題就解決了
以下示范腳本展示了這樣的一個異常
以及如何用檢查約束來糾正它
SET NOCOUNT ONGOCREATE TABLE parent (pkey
INT IDENTITY NOT NULL
pkey
INT
NOT NULL
col
INT NULL
CONSTRAINT 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 NULL
CONSTRAINT 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
空值是所有數據庫開發者和管理員都要遇到的
所以
要想開發成功的應用程序
必須知道如何處理這些值
本文和你分享了空值處理的一些技巧和技術
From:http://tw.wingwit.com/Article/os/xtgl/201311/9134.html