簡體   English   中英

使用IN條件對新表的檢查約束未按預期工作

[英]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約束與WHERECASE條件不同。 僅當結果顯式為 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM