Skip to content

SQL CHECK

SQL CHECK 约束用于限制列中值的范围,确保列中的值满足指定的条件。当向表中插入或更新数据时,CHECK 约束会验证数据是否符合条件,只有符合条件的数据才能被插入或更新。

语法

创建表时添加 CHECK 约束

sql
CREATE TABLE table_name (
    column1 datatype CHECK (condition),
    column2 datatype CHECK (condition),
    ...
);

命名 CHECK 约束

sql
CREATE TABLE table_name (
    column1 datatype,
    column2 datatype,
    ...
    CONSTRAINT constraint_name CHECK (condition)
);

表创建后添加 CHECK 约束

sql
ALTER TABLE table_name
ADD CHECK (condition);
sql
-- 命名约束
ALTER TABLE table_name
ADD CONSTRAINT constraint_name CHECK (condition);

移除 CHECK 约束

sql
ALTER TABLE table_name
DROP CHECK constraint_name;
-- 注意:在不同数据库系统中,移除 CHECK 约束的语法可能不同

示例

示例 1:创建表时添加单个列的 CHECK 约束

sql
CREATE TABLE students (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    age INT CHECK (age >= 0 AND age <= 100),
    grade VARCHAR(20),
    gender VARCHAR(10) CHECK (gender IN ('男', '女', '未知'))
);

执行结果:创建一个名为 students 的表,其中 age 列的值必须在 0 到 100 之间,gender 列的值必须是 '男'、'女' 或 '未知'。

示例 2:创建表时添加表级 CHECK 约束

sql
CREATE TABLE employees (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    hire_date DATE NOT NULL,
    salary DECIMAL(10,2) NOT NULL,
    department VARCHAR(50) NOT NULL,
    CONSTRAINT check_salary CHECK (salary >= 0),
    CONSTRAINT check_hire_date CHECK (hire_date <= CURRENT_DATE)
);

执行结果:创建一个名为 employees 的表,其中 salary 列的值必须大于或等于 0,hire_date 列的值必须小于或等于当前日期。

示例 3:向有 CHECK 约束的表插入数据

sql
-- 成功插入数据(符合所有 CHECK 约束)
INSERT INTO students (name, age, grade, gender)
VALUES ('张三', 18, '高三', '男');

-- 成功插入数据(gender 列使用允许的值)
INSERT INTO students (name, age, grade, gender)
VALUES ('李四', 17, '高二', '女');

-- 失败插入数据(age 列的值超出范围)
INSERT INTO students (name, age, grade, gender)
VALUES ('王五', 101, '高三', '男');

-- 失败插入数据(gender 列的值不在允许的范围内)
INSERT INTO students (name, age, grade, gender)
VALUES ('赵六', 16, '高一', '其他');

示例 4:更新有 CHECK 约束的表中的数据

sql
-- 成功更新数据(符合 CHECK 约束)
UPDATE students
SET age = 19
WHERE name = '张三';

-- 失败更新数据(age 列的值超出范围)
UPDATE students
SET age = -1
WHERE name = '张三';

示例 5:表创建后添加 CHECK 约束

sql
-- 创建表
CREATE TABLE students (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    age INT,
    grade VARCHAR(20)
);

-- 添加 CHECK 约束到 age 列
ALTER TABLE students
ADD CHECK (age >= 0 AND age <= 100);

示例 6:命名 CHECK 约束

sql
-- 创建表时命名约束
CREATE TABLE students (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    age INT,
    grade VARCHAR(20),
    CONSTRAINT check_age_range CHECK (age >= 0 AND age <= 100)
);

-- 表创建后命名约束
ALTER TABLE students
ADD CONSTRAINT check_age_range CHECK (age >= 0 AND age <= 100);

注意事项

  1. 不同数据库的支持:虽然 CHECK 约束是 SQL 标准的一部分,但不同数据库系统对其支持程度可能不同。例如,在某些旧版本的 MySQL 中,CHECK 约束会被解析但不会被强制执行。

  2. 性能影响:CHECK 约束会在插入和更新操作时进行验证,可能会影响这些操作的性能。对于大型表,应谨慎使用复杂的 CHECK 约束。

  3. 条件复杂性:CHECK 约束的条件可以是任意复杂的布尔表达式,但过于复杂的条件可能会使代码难以理解和维护。

  4. NULL 值:如果列允许为 NULL,则 NULL 值会通过 CHECK 约束的验证,因为 NULL 与任何值比较的结果都是 NULL,而 NULL 在布尔上下文中被视为 false。

  5. 外键与 CHECK:对于表之间的关系,应使用外键约束而不是 CHECK 约束。

小结

SQL CHECK 约束是一种用于限制列中值的范围的约束,它确保列中的值满足指定的条件。通过使用 CHECK 约束,可以提高数据的完整性和一致性,减少数据错误。在创建表时或表创建后,都可以添加 CHECK 约束。不同数据库系统对 CHECK 约束的支持程度可能不同,使用时需要注意。