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约束,即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')
Copyright 2023 fuwu029.com赣ICP备2022008914号-4