check約束

check約束

在資料庫中,CHECK 約束是指約束表中某一個或者某些列中可接受的數據值或者數據格式。例如,可以要求 authors 表的 postcode 列只允許輸入六位數字的郵政編碼。

CHECK 約束可以應用於一個或者多個列,也可以將多個CHECK 約束應用於一個列。

當除去某個表時,對這個表的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,語句如下:
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')