2015-03-24 88 views
1

我試圖約束添加到表,其中一列必須是值中的一個類似下面的列表:爲什麼是SQL Server不工作檢查約束

ALTER TABLE bread_crumbs WITH CHECK 
    ADD CONSTRAINT CK_uplink_relationship 
    CHECK (uplink_relationship in ('Cites', 'CitedBy', null)) 

我可以仍然插入uplink_relationship列的任何值的行。 CHECK約束沒有被強制執行。

我讀了幾個答案,如果您在創建約束的同時存在違反約束的行,則可能會發生這種情況。

所以我刪除了約束,固定所有的數據,並添加約束回。

,但沒有運氣。

我仍然可以輸入無效數據。

任何想法爲什麼會發生這種情況?

此外,我嘗試了和沒有WITH CHECK聲明的一部分。

+2

SQL使用三個值邏輯。 'true','false','未知'。如果條件評估爲「false」,則檢查約束只會被違反。 – 2015-03-24 21:38:52

+0

'IN(null)'計算爲'= NULL';這總是未知的。你不能檢查是否* *等於*'NULL',只有當它是'NULL'時。 – 2015-03-24 22:43:19

回答

5

NULL必須單獨

處理嘗試查詢

Select * from employee where empId in (1, 2, NULL) -- will result in 0 records 

ALTER TABLE bread_crumbs 
WITH CHECK 
ADD CONSTRAINT CK_uplink_relationship 
CHECK (uplink_relationship in ('Cites','CitedBy') OR uplink_relationship IS NULL) 

編輯:

SET ASI_NULL

+1

@MartinSmith:感謝您的更正:)我將刪除它 – 2015-03-24 21:40:29

+0

謝謝 - IS NULL工作。 – Sam 2015-03-25 13:14:32