- SQL 教程
- SQL - 首页
- SQL - 概述
- SQL - RDBMS 概念
- SQL - 数据库
- SQL - 语法
- SQL - 数据类型
- SQL - 运算符
- SQL - 表达式
- SQL 数据库
- SQL - 创建数据库
- SQL - 删除数据库
- SQL - 选择数据库
- SQL - 重命名数据库
- SQL - 显示数据库
- SQL - 备份数据库
- SQL 表
- SQL - 创建表
- SQL - 显示表
- SQL - 重命名表
- SQL - 截断表
- SQL - 克隆表
- SQL - 临时表
- SQL - 修改表
- SQL - 删除表
- SQL - 删除表
- SQL - 约束
- SQL 查询
- SQL - 插入查询
- SQL - 选择查询
- SQL - SELECT INTO
- SQL - INSERT INTO SELECT
- SQL - 更新查询
- SQL - 删除查询
- SQL - 排序结果
- SQL 视图
- SQL - 创建视图
- SQL - 更新视图
- SQL - 删除视图
- SQL - 重命名视图
- SQL 运算符和子句
- SQL - WHERE 子句
- SQL - TOP 子句
- SQL - DISTINCT 子句
- SQL - ORDER BY 子句
- SQL - GROUP BY 子句
- SQL - HAVING 子句
- SQL - AND & OR
- SQL - 布尔 (BIT) 运算符
- SQL - LIKE 运算符
- SQL - IN 运算符
- SQL - ANY, ALL 运算符
- SQL - EXISTS 运算符
- SQL - CASE
- SQL - NOT 运算符
- SQL - 不等于
- SQL - IS NULL
- SQL - IS NOT NULL
- SQL - NOT NULL
- SQL - BETWEEN 运算符
- SQL - UNION 运算符
- SQL - UNION vs UNION ALL
- SQL - INTERSECT 运算符
- SQL - EXCEPT 运算符
- SQL - 别名
- SQL 连接
- SQL - 使用连接
- SQL - 内连接
- SQL - 左连接
- SQL - 右连接
- SQL - 交叉连接
- SQL - 全连接
- SQL - 自连接
- SQL - 删除连接
- SQL - 更新连接
- SQL - 左连接 vs 右连接
- SQL - UNION vs JOIN
- SQL 键
- SQL - 唯一键
- SQL - 主键
- SQL - 外键
- SQL - 组合键
- SQL - 备选键
- SQL 索引
- SQL - 索引
- SQL - 创建索引
- SQL - 删除索引
- SQL - 显示索引
- SQL - 唯一索引
- SQL - 聚簇索引
- SQL - 非聚簇索引
- 高级 SQL
- SQL - 通配符
- SQL - 注释
- SQL - 注入
- SQL - 托管
- SQL - MIN & MAX
- SQL - NULL 函数
- SQL - 检查约束
- SQL - 默认约束
- SQL - 存储过程
- SQL - NULL 值
- SQL - 事务
- SQL - 子查询
- SQL - 处理重复项
- SQL - 使用序列
- SQL - 自动递增
- SQL - 日期和时间
- SQL - 游标
- SQL - 公共表表达式
- SQL - GROUP BY vs ORDER BY
- SQL - IN vs EXISTS
- SQL - 数据库调优
- SQL 函数参考
- SQL - 日期函数
- SQL - 字符串函数
- SQL - 聚合函数
- SQL - 数值函数
- SQL - 文本和图像函数
- SQL - 统计函数
- SQL - 逻辑函数
- SQL - 游标函数
- SQL - JSON 函数
- SQL - 转换函数
- SQL - 数据类型函数
- SQL 有用资源
- SQL - 问答
- SQL - 快速指南
- SQL - 有用函数
- SQL - 有用资源
- SQL - 讨论
SQL - 检查约束
SQL CHECK 约束
SQL 的CHECK 约束用于向表的列添加条件。
在列上添加检查约束后,它可确保输入到该列的数据满足指定的条件。如果特定记录不满足这些条件,则数据库将阻止您插入或更新该记录。
假设我们有一个名为 CUSTOMERS 的表,其中包含一个 AGE 列。我们可以在此列上添加CHECK 约束,以确保输入的年龄始终为正数且不超过 50 岁。如果有人试图输入负年龄或超过 50 岁的年龄,数据库将拒绝它,确保您的数据保持准确和有效。
单列检查约束
要在列级别添加检查约束,我们必须在创建表时在列名之后指定检查约束。
语法
以下是指定单列检查约束的语法:
CREATE TABLE table_name ( column_name data_type CHECK (condition) );
示例
在下面的查询中,我们正在创建一个名为 CUSTOMERS 的表。在这里,我们正在 AGE 列上指定列级检查约束,该约束仅允许插入客户年龄值大于“20”的记录:
CREATE TABLE CUSTOMERS ( ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, AGE INT NOT NULL CHECK(AGE>=20), ADDRESS CHAR (25), SALARY DECIMAL (18, 2), PRIMARY KEY (ID) );
验证
要验证是否已向 AGE 列添加检查约束,我们可以在 MySQL 数据库中使用以下查询:
SELECT table_name, constraint_type, constraint_name FROM information_schema.table_constraints WHERE table_name='CUSTOMERS';
输出
上述查询将显示 CUSTOMERS 表的所有详细信息,包括有多少列具有检查约束以及我们在表中指定了哪些约束,如下所示:
| 表名 | 约束类型 | 约束名 |
|---|---|---|
| customers | 主键 | PRIMARY |
| customers | 主键 | PRIMARY |
| customers | 主键 | PRIMARY |
| customers | 主键 | PRIMARY |
| customers | 检查 | employees_chk_1 |
现在,要验证 CHECK 约束是否正常工作,让我们向 CUSTOMERS 中插入一条记录,其中 AGE 包含小于 20 的值(不满足给定条件):
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, 'Ramesh', 15, 'Ahmedabad', 2000.00 );
上述查询的输出如下所示:
ERROR 3819 (HY000): Check constraint 'customers_chk_1' is violated.
多列检查约束
我们还可以通过指定必须满足这些列的值组合的条件,在表的多个列上添加检查约束。
假设我们有一个表,其中包含产品的详细信息,包括它们的开始日期和结束日期。我们可以添加一个 CHECK 约束,以确保结束日期始终大于或等于开始日期。在这种情况下,约束正在检查同一行中两列(开始日期和结束日期)的值,以确保它们遵循特定的关系。
示例
在下面的示例中,我们正在 CUSTOMERS 表的多个列(AGE 和 SALARY)上指定列级检查约束。在这里,AGE 列仅允许 AGE 大于或等于 20 的记录,SALARY 列仅允许 SALARY 大于 20000 的记录:
CREATE TABLE CUSTOMERS ( ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, AGE INT NOT NULL CHECK(AGE >= 20), ADDRESS CHAR (25), SALARY DECIMAL (18, 2) CHECK(SALARY >= 20000), PRIMARY KEY (ID) );
验证
要验证检查约束是否应用于这两列,我们可以在 MySQL 数据库中使用以下查询:
SELECT table_name, constraint_type, constraint_name FROM information_schema.table_constraints WHERE table_name='CUSTOMERS';
输出
它将显示已创建表的全部详细信息,包括有多少列具有检查约束以及我们在表中指定的约束:
| 表名 | 约束类型 | 约束名 |
|---|---|---|
| customers | 主键 | PRIMARY |
| customers | 主键 | PRIMARY |
| customers | 主键 | PRIMARY |
| customers | 主键 | PRIMARY |
| customers | 检查 | customers_chk_1 |
| customers | 检查 | customers_chk_2 |
现在,我们正在向 CUSTOMERS 表中插入值,其中年龄小于 20,工资小于 20000。
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, 'Ramesh', 15, 'Ahmedabad', 2000.00 );
上述查询抛出错误,因为 AGE 和 SALARY 列中传递的值不满足 CHECK 约束:
ERROR 3819 (HY000): Check constraint 'customers_chk_1' is violated.
表级检查约束
为了确保表级检查约束,我们必须在完成表创建之前使用检查约束。
语法
以下是指定表级检查约束的语法:
CREATE TABLE table_name ( column1 data_type, column2 data_type,..., CONSTRAINT constraint_name CHECK(column_name condition_value) );
示例
在以下 SQL 查询中,我们正在创建一个名为 PRODUCTS 的表。在这里,我们正在 DATE_OF_ORDER 列上指定表级检查约束,该约束仅允许插入 DATE_OF_ORDER 小于(早于)“2023-02-09”的记录:
CREATE TABLE PRODUCTS( PID INT NOT NULL, PNAME VARCHAR(30), DELIVERY_CITY VARCHAR(20), DATE_OF_ORDER Date NOT NULL, PRICE INT, PRIMARY KEY(PID), CONSTRAINT Constraint_DOO CHECK(DATE_OF_ORDER <= '2023-02-09') );
验证
我们可以使用以下 SQL 查询验证已创建表上的 CHECK 约束:
SELECT table_name, constraint_type, constraint_name FROM information_schema.table_constraints WHERE table_name='PRODUCTS';
输出
它将显示已创建表的全部详细信息,包括表级别有多少列具有检查约束,如下所示:
| 表名 | 约束类型 | 约束名 |
|---|---|---|
| products | 主键 | PRIMARY |
| products | 检查 | Constraint_DOO |
在这里,我们正在向 PRODUCTS 中插入值,该值在 DATE_OF_ORDER 列上具有小于“2023-02-09”的约束:
INSERT INTO PRODUCTS VALUES (001, 'Nike Shoe', 'Ranchi', '2023-01-11', 2000);
以下是上述查询的输出:
Query OK, 1 row affected (0.01 sec)
现有列的检查约束
我们可以使用ALTER TABLE语句向表的现有列添加检查约束。
语法
以下是向现有表添加检查约束的语法:
ALTER TABLE table_name ADD CONSTRAINT constraint_name CHECK(ColumnName condition_value);
示例
在以下查询中,我们正在创建一个名为 CUSTOMERS 的表:
CREATE TABLE CUSTOMERS ( ID INT NOT NULL, NAME VARCHAR(20) NOT NULL, AGE INT NOT NULL, ADDRESS CHAR (25), SALARY DECIMAL (18, 2), PRIMARY KEY (ID) );
要向 AGE 列添加检查约束,我们使用以下查询:
ALTER TABLE CUSTOMERS ADD CONSTRAINT Constraint_Age CHECK (AGE >= 21);
验证
要验证表创建后是否应用了检查约束,请使用以下 SQL 查询:
SELECT table_name, constraint_type, constraint_name FROM information_schema.table_constraints WHERE table_name='CUSTOMERS';
输出
它将显示表的全部信息,包括我们添加到年龄列的约束:
| 表名 | 约束类型 | 约束名 |
|---|---|---|
| customers | 主键 | PRIMARY |
| customers | 主键 | PRIMARY |
| customers | 主键 | PRIMARY |
| customers | 主键 | PRIMARY |
| customers | 检查 | Constraint_Age |
删除检查约束
如果有一种方法可以在列上添加约束,那么您也必须能够从该列中删除约束。为此,可以使用ALTER DROP语句。
语法
以下是从表中删除检查约束的语法:
ALTER TABLE table_name DROP CONSTRAINT constraint_name;
示例
下面的示例显示如何从上面创建的 CUSTOMERS 表中删除检查约束:
ALTER TABLE CUSTOMERS DROP CONSTRAINT Constraint_Age;
验证
使用以下 SQL 查询,我们正在验证约束是否已删除:
SELECT table_name, constraint_type, constraint_name FROM information_schema.table_constraints WHERE table_name='CUSTOMERS';
输出
我们可以看到,添加到年龄列的检查约束已删除:
| 表名 | 约束类型 | 约束名 |
|---|---|---|
| customers | 主键 | PRIMARY |
| customers | 主键 | PRIMARY |
| customers | 主键 | PRIMARY |
| customers | 主键 | PRIMARY |