複製鏈接
請複製以下鏈接發送給好友

check約束

鎖定
在數據庫中,CHECK 約束是指約束表中某一個或者某些列中可接受的數據值或者數據格式。例如,可以要求 authors 表的 postcode 列只允許輸入六位數字的郵政編碼
CHECK 約束可以應用於一個或者多個列,也可以將多個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')
)
)