2015-03-24 89 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