使用 IN 条件检查新 table 的约束未按预期工作
Check constraint on new table using an IN condition is not working as expected
我创建了一个新的 table,其中包括使用 in 子句创建允许条目列表的检查约束,或者至少这是计划。 create table 命令执行时没有错误但是在测试中我能够插入行而没有约束防止列 "CAUSE"
的不正确值
我已经做了一些互联网研究,但我还没有想出这个。我将在下面包含 create table 语句。
'''
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)
)
);
'''
我希望 CAUSE 列中唯一允许的值是 chk_cause 约束中标识的值,但是它允许输入任何值。
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
未声明 [=18=])。
您的版本的问题是其他值将导致 NULL
(由于 IN
列表中的 NULL
)。这通过了 CHECK
约束。
我创建了一个新的 table,其中包括使用 in 子句创建允许条目列表的检查约束,或者至少这是计划。 create table 命令执行时没有错误但是在测试中我能够插入行而没有约束防止列 "CAUSE"
的不正确值我已经做了一些互联网研究,但我还没有想出这个。我将在下面包含 create table 语句。
'''
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)
)
);
'''
我希望 CAUSE 列中唯一允许的值是 chk_cause 约束中标识的值,但是它允许输入任何值。
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
未声明 [=18=])。
您的版本的问题是其他值将导致 NULL
(由于 IN
列表中的 NULL
)。这通过了 CHECK
约束。