SQL |检查约束
SQL 约束
Check Constraint 用于指定每个元组在给定关系中必须满足的谓词。它限制了列可以在关系中保存的值。
- 检查约束中的谓词可以包含子查询。
- 在属性上定义的检查约束限制了该属性的值范围。
- 如果添加到元组属性的值违反了检查约束,则检查约束评估为 false 并且相应的更新被中止。
- 检查约束通常使用 SQL 中的 CREATE TABLE 命令指定。
句法:
CREATE TABLE pets(
ID INT NOT NULL,
Name VARCHAR(30) NOT NULL,
Breed VARCHAR(20) NOT NULL,
Age INT,
GENDER VARCHAR(9),
PRIMARY KEY(ID),
check(GENDER in ('Male', 'Female', 'Unknown'))
);
注意:上述 SQL 命令中的检查约束将 GENDER 限制为仅属于指定的类别。如果添加新元组或使用不属于上述三个类别中的任何一个的 GENDER 更新关系中的现有元组,则中止相应的数据库更新。
询问
限制:只有年龄> = 17的学生才能进入大学。
大学学生数据库的架构:
CREATE TABLE student(
StudentID INT NOT NULL,
Name VARCHAR(30) NOT NULL,
Age INT NOT NULL,
GENDER VARCHAR(9),
PRIMARY KEY(ID),
check(Age >= 17)
);
学生关系:
StudentID | Name | Age | Gender |
---|---|---|---|
1001 | Ron | 18 | Male |
1002 | Sam | 17 | Male |
1003 | Georgia | 17 | Female |
1004 | Erik | 19 | Unknown |
1005 | Christine | 17 | Female |
解释:在上述关系中,所有学生的年龄都大于等于 17 岁,根据关系模式中检查语句中提到的约束。但是,如果执行以下 SQL 语句:
INSERT INTO student(STUDENTID, NAME, AGE, GENDER)
VALUES (1006, 'Emma', 16, 'Female');
不会有任何数据库更新,并且年龄 < 17 岁。
使用检查约束的不同选项:
- 使用 alter: Check 约束也可以使用以下语法添加到已创建的关系中:
alter table TABLE_NAME modify COLUMN_NAME check(Predicate);
- 为检查约束赋予变量名:检查约束可以使用以下语法赋予变量名:
alter table TABLE_NAME add constraint CHECK_CONST check (Predicate);
- 删除检查约束:可以使用以下语法从 SQL Server 的数据库中的关系中删除检查约束:
alter table TABLE_NAME drop constraint CHECK_CONSTRAINT_NAME;
- 删除检查约束:可以使用以下语法从 MySQL 数据库中的关系中删除检查约束:
alter table TABLE_NAME drop check CHECK_CONSTRAINT_NAME;