我创建了一个新表,其中包含一个检查约束,该约束使用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约束中标识的值,但是它允许输入任何值。
答案 0 :(得分:0)
window.print()
约束与CHECK
和WHERE
条件不同。 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
约束。