[英]Check constraint on new table using an IN condition is not working as expected
我創建了一個新表,其中包含一個檢查約束,該約束使用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約束中標識的值,但是它允許輸入任何值。
CHECK
約束與WHERE
和CASE
條件不同。 僅當結果顯式為 false時, 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
(由於IN
列表中的NULL
)。 並通過了CHECK
約束。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.