Appearance
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);注意事项
不同数据库的支持:虽然 CHECK 约束是 SQL 标准的一部分,但不同数据库系统对其支持程度可能不同。例如,在某些旧版本的 MySQL 中,CHECK 约束会被解析但不会被强制执行。
性能影响:CHECK 约束会在插入和更新操作时进行验证,可能会影响这些操作的性能。对于大型表,应谨慎使用复杂的 CHECK 约束。
条件复杂性:CHECK 约束的条件可以是任意复杂的布尔表达式,但过于复杂的条件可能会使代码难以理解和维护。
NULL 值:如果列允许为 NULL,则 NULL 值会通过 CHECK 约束的验证,因为 NULL 与任何值比较的结果都是 NULL,而 NULL 在布尔上下文中被视为 false。
外键与 CHECK:对于表之间的关系,应使用外键约束而不是 CHECK 约束。
小结
SQL CHECK 约束是一种用于限制列中值的范围的约束,它确保列中的值满足指定的条件。通过使用 CHECK 约束,可以提高数据的完整性和一致性,减少数据错误。在创建表时或表创建后,都可以添加 CHECK 约束。不同数据库系统对 CHECK 约束的支持程度可能不同,使用时需要注意。