📜  SQL |检查约束

📅  最后修改于: 2022-05-13 01:55:06.579000             🧑  作者: Mango

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)
        );

学生关系:

StudentIDNameAgeGender
1001Ron18Male
1002Sam17Male
1003Georgia17Female
1004Erik19Unknown
1005Christine17Female

解释:在上述关系中,所有学生的年龄都大于等于 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;