check約束

在資料庫中,CHECK 約束是指約束表中某一個或者某些列中可接受的數據值或者數據格式。例如,可以要求 authors 表的 postcode 列只允許輸入六位數字的郵政編碼。 CHECK 約束可以套用於一個或者多個列,也可以將多個CHECK 約束套用於一個列。 當除去某個表時,對這個表的CHECK 約束也將同時被去除。

CHECK 約束的限制

CHECK 約束不接受計算結果為 FALSE 的值。因為空值的計算結果為 UNKNOWN,所以如果賦值表達式中存在這些值,則約束可能會被覆蓋而不起作用。例如,假設對 intMyColumn 套用一個約束,指定 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')

)

)

相關詞條

相關搜尋

熱門詞條

聯絡我們