CHECK 約束的限制
CHECK 約束不接受計算結果為 FALSE 的值。因為空值的計算結果為 UNKNOWN,所以如果賦值表達式中存在這些值,則約束可能會被覆蓋而不起作用。例如,假設對 int 列 MyColumn 套用一個約束,指定 MyColumn 只能包含值 10(即 MyColumn = 10)。如果將值 NULL 插入到 MyColumn,資料庫引擎將插入 NULL 且不返回錯誤。
如果 CHECK 約束檢查的條件對於表中的任何行都不是 FALSE,它將返回 TRUE。如果剛創建的表沒有任何行,則此表的任何 CHECK 約束都視為有效。這種情況可能會產生意外結果,如下面的示例所示。
CREATE TABLE CheckTbl (col1 int, col2 int);GOCREATE FUNCTION CheckFnctn()RETURNS intAS BEGIN DECLARE @retval int SELECT @retval = COUNT(*) FROM CheckTbl RETURN @retvalEND;GOALTER TABLE CheckTblADD CONSTRAINT chkRowCount CHECK (dbo.CheckFnctn() >= 1 );GO 添加的 CHECK 約束指定表 CheckTbl 必須至少包含一行。但是,因為表中不包含任何可供檢查此約束的條件的行,所以 ALTER TABLE 語句將成功。
執行 DELETE 語句時不驗證 CHECK 約束。因此,使用特定類型的 CHECK 約束對表執行 DELETE 語句時可能會產生意外結果。例如,假設對表 CheckTbl 執行下列語句。
INSERT INTO CheckTbl VALUES (10, 10)
GO
DELETE CheckTbl WHERE col1 = 10;
即使 CHECK 約束指定表 CheckTbl 必須至少包含 1 行,DELETE 語句也會成功。
創建表時創建CHECK
例如,將【成績信息】表中“分數”列指定為CHECK約束,即0<=分數<=100,語句如下:
USE 學生成績管理系統
CREATE TABLE 成績信息
(
成績編號 int NOT NULL PRIMARY KEY,
學生編號 nchar(50) NOT NULL,
考試編號 nchar(10) NOT NULL,
課程編號nchar(10) NOT NULL,
分數 nchar(10) NOT NULL CHECK (分數in(between '0' and '100')
)
)