- 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 - 选择进入
- SQL - 插入选择
- SQL - 更新查询
- SQL - 删除查询
- SQL - 对结果进行排序
- SQL 视图
- SQL - 创建视图
- SQL - 更新视图
- SQL - 删除视图
- SQL - 重命名视图
- SQL 运算符和子句
- SQL-Where 子句
- SQL - 顶部子句
- SQL - 不同子句
- SQL - Order By 子句
- SQL - Group By 子句
- SQL-Having 子句
- SQL - 与与或
- SQL - 布尔(位)运算符
- SQL - LIKE 运算符
- SQL - IN 运算符
- SQL - ANY、ALL 运算符
- SQL - EXISTS 运算符
- SQL-案例
- SQL - NOT 运算符
- SQL - 不等于
- SQL - 为空
- SQL - 不为空
- SQL - 非空
- SQL - BETWEEN 运算符
- SQL - UNION 运算符
- SQL - UNION 与 UNION ALL
- SQL - 相交运算符
- SQL - EXCEPT 运算符
- 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 - 非聚集索引
- 高级SQL
- SQL - 通配符
- SQL - 注释
- SQL-注入
- SQL-托管
- SQL - 最小值和最大值
- SQL - 空函数
- SQL - 检查约束
- SQL - 默认约束
- SQL-存储过程
- SQL - NULL 值
- SQL - 事务
- SQL - 子查询
- SQL - 处理重复项
- SQL - 使用序列
- SQL-自动递增
- SQL - 日期和时间
- SQL-游标
- SQL - 公用表表达式
- SQL - 分组依据与排序依据
- SQL - IN 与 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 表的所有详细信息,包括有多少列具有检查约束以及我们在表中指定的约束,如下所示 -
表名 | 约束类型 | CONSTRAINT_NAME |
---|---|---|
顾客 | 首要的关键 | 基本的 |
顾客 | 首要的关键 | 基本的 |
顾客 | 首要的关键 | 基本的 |
顾客 | 首要的关键 | 基本的 |
顾客 | 查看 | 员工_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';
输出
它将显示创建的表的所有详细信息,包括有多少列具有检查约束以及我们在表中指定的约束 -
表名 | 约束类型 | CONSTRAINT_NAME |
---|---|---|
顾客 | 首要的关键 | 基本的 |
顾客 | 首要的关键 | 基本的 |
顾客 | 首要的关键 | 基本的 |
顾客 | 首要的关键 | 基本的 |
顾客 | 查看 | 客户_chk_1 |
顾客 | 查看 | 客户_chk_2 |
现在,我们将年龄小于 20 岁且工资小于 20000 的值插入到 CUSTOMERS 表中。
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';
输出
它将显示创建的表的所有详细信息,包括有多少列在表级别具有检查约束,如下所示 -
表名 | 约束类型 | CONSTRAINT_NAME |
---|---|---|
产品 | 首要的关键 | 基本的 |
产品 | 查看 | 约束_DOO |
在这里,我们在 DATE_OF_ORDER 列上的约束小于“2023-02-09”的 PRODUCTS 中插入值-
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';
输出
它将显示表的所有信息,包括我们添加到年龄列的约束 -
表名 | 约束类型 | CONSTRAINT_NAME |
---|---|---|
顾客 | 首要的关键 | 基本的 |
顾客 | 首要的关键 | 基本的 |
顾客 | 首要的关键 | 基本的 |
顾客 | 首要的关键 | 基本的 |
顾客 | 查看 | 约束_年龄 |
删除检查约束
如果有办法在列上添加约束,那么您还必须能够从该列中删除约束。为此,您可以使用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';
输出
我们可以看到年龄列上添加的检查约束被删除 -
表名 | 约束类型 | CONSTRAINT_NAME |
---|---|---|
顾客 | 首要的关键 | 基本的 |
顾客 | 首要的关键 | 基本的 |
顾客 | 首要的关键 | 基本的 |
顾客 | 首要的关键 | 基本的 |