使用IN条件的新表的检查约束未按预期工作

时间:2019-06-20 15:20:37

标签: sql sql-server-2008

我创建了一个新表,其中包含一个检查约束,该约束使用in子句创建允许条目的列表,或者至少是计划。创建表命令执行没有错误,但是在测试中,我能够插入行而没有约束,从而防止了“ CAUSE”列的值不正确

我做了一些互联网研究,但是我还没有想到这一点。我将在下面包含创建表语句。

'''

USE TEST 
GO

CREATE TABLE EMP_POINTS (
ROWID int NOT NULL IDENTITY(1,1),
WEEK_ID nvarchar(15) NOT NULL,
EMPLOYEE_ID nvarchar(15) NOT NULL,
DATE date NOT NULL,
CAUSE nvarchar(15),
POINTS decimal(2,1),

PRIMARY KEY(EMPLOYEE_ID, DATE),
CONSTRAINT FK_EmpID FOREIGN KEY(EMPLOYEE_ID) REFERENCES EMPLOYEE(ID),
CONSTRAINT chk_cause CHECK (
                            CAUSE IN('Late In','Early Out','E & L', 'NCNS', 'Absent', '0.5','1.0', NULL)
                           )
);

'''

我希望“原因”列中唯一允许的值是chk_cause约束中标识的值,但是它允许输入任何值。

1 个答案:

答案 0 :(得分:0)

window.print()约束与CHECKWHERE条件不同。 CASE约束仅在结果显式为假时失败。其他要求条件明确为真。区别在于如何处理CHECK值。

因此,您可以将约束写为:

NULL

然后,仅允许这些值 CONSTRAINT chk_cause CHECK (CAUSE IN('Late In', 'Early Out', 'E & L', 'NCNS', 'Absent', '0.5', '1.0') ) (假设未声明NULL CAUSE)。

您的版本存在的问题是其他值将导致NOT NULL(由于NULL列表中的NULL)。并通过了IN约束。