CHECK 约束(CHECK 约束:定义列中可接受的数据值。可以将 CHECK 约束应用于多个列,也可以将多个 CHECK 约束应用于单个列。当除去某个表时,也将除去 CHECK 约束。)指定可由表中一列或多列接受的数据值或格式。
例如,可以要求 authors 表的 zip 列只允许输入五位数的数字项。
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) NULL,
课程编号nchar(10) NOT NULL,
分数 nchar(10) NULL CHECK (分数in ['0', '100'])
)
/*服务器: 消息 170,级别 15,状态 1,行 6
第 6 行: ''0', '100'' 附近有语法错误。*/