Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >CHECK约束_数据库check约束怎么写

CHECK约束_数据库check约束怎么写

作者头像
全栈程序员站长
发布于 2022-09-19 01:37:25
发布于 2022-09-19 01:37:25
1.8K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

CHECK约束会检查输入到记录中的值是否满足一个条件,如果不满足这个条件则对数据库做的修改不会成功。比如,一个人的年龄是不可能为负数的,一个人的入学日期不可能早于出生日期,出厂月份不可能大于12。可以在CHECK条件中使用任意有效的SQL表达式,CHECK约束对于插入、更新等任何对数据进行变化的操作都进行检查。

在字段定义后添加CHECK 表达式就可以为这个字段添加CHECK约束,几乎所有字段中都可以添加CHECK约束,也就是一张表中可以存在多个CHECK 约束。

下面的SQL语句创建了一张用于保存人员信息的表T_Person,其中字段FNumber 为人员编号,字段FName 为人员姓名,字段FAge为人员年龄,字段FWorkYear为人员工龄:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MYSQL,MSSQLServer,DB2:

CREATE TABLE T_Person (FNumber VARCHAR(20),FName VARCHAR(20),FAge INT CHECK(FAge >0),FWorkYear INT CHECK(FWorkYear>0)) Oracle: CREATE TABLE T_Person (FNumber VARCHAR2(20),FName VARCHAR2(20),FAge NUMBER (10) CHECK(FAge >0),FWorkYear NUMBER (10) CHECK(FWorkYear>0)) 

一个人的年龄和工龄显然不应该为负值的,所以为FAge和FWorkYear两个字段增加了CHECK约束“FAge>0”和“FWeight>0”。表创建完毕后执行下面的SQL语句进行测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSERT INTO T_Person(FNumber, FName, FAge, FWorkYear) VALUES("001","John",25,-3) 

因为这里将FWorkYear字段设置成了-3,这是违反“CHECK(FWorkYear>0)”这个CHECK约束,所以在数据库中执行此SQL语句后数据库会报出下面错误信息:

  • INSERT 语句与CHECK 约束”CKT_PersonFWorkY__24927208″冲突。该冲突发生于数据库”demo”,表”dbo.T_Person”, column “FWorkYear”。

而执行下面的SQL语句则可以成功执行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSERT INTO T_Person(FNumber, FName, FAge, FWorkYear) VALUES("001","John",25,3) 

除了可以在CHECK 约束中使用常量表达式之外,还可以在CHECK 约束中使用函数,比如人员编号长度要大于12,那么就需要如下编写建表语句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MYSQL,DB2:

CREATE TABLE T_Person (FNumber VARCHAR(20) CHECK (LENGTH(FNumber)>12),FName VARCHAR(20),FAge INT CHECK(FAge >0),FWorkYear INT CHECK(FWorkYear>0)) MSSQLServer: CREATE TABLE T_Person (FNumber VARCHAR(20) CHECK (LEN(FNumber)>12),FName VARCHAR(20),FAge INT CHECK(FAge >0),FWorkYear INT CHECK(FWorkYear>0)) Oracle: CREATE TABLE T_Person (FNumber VARCHAR2(20) CHECK (LENGTH(FNumber)>12),FName VARCHAR2(20),FAge NUMBER (10) CHECK(FAge >0),FWorkYear NUMBER (10) CHECK(FWorkYear>12)) 

表创建完毕后执行下面的SQL语句进行测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSERT INTO T_Person(FNumber, FName, FAge, FWorkYear) VALUES("001","John",25, 3) 

因为这里将FNumber字段设置成了”001″,这是违反“CHECK(LENGTH(FNumber)>12)”这个CHECK约束的,所以在数据库中执行此SQL语句后数据库会报出下面错误信息:

  • INSERT 语句与CHECK 约束”CKT_PersonFNumbe__267ABA7A”冲突。该冲突发生于数据库”demo”,表”dbo.T_Person”, column “FNumber”。

而执行下面的SQL语句则可以成功执行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSERT INTO T_Person(FNumber, FName, FAge, FWorkYear)VALUES("001001001001001","John",25,3) 

这种直接在列定义中通过CHECK子句添加CHECK约束的方式的缺点是约束条件不能引用其他列。比如我们想约束“人员的工龄必须小于他的年龄”,那么我们执行下面的SQL语句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MYSQL,DB2:

CREATE TABLE T_Person (FNumber VARCHAR(20),FName VARCHAR(20),FAge INT,FWorkYear INT CHECK(FWorkYear< FAge)) MSSQLServer: CREATE TABLE T_Person (FNumber VARCHAR(20),FName VARCHAR(20),FAge INT,FWorkYear INT CHECK(FWorkYear< FAge)) Oracle: CREATE TABLE T_Person (FNumber VARCHAR2(20),FName VARCHAR2(20),FAge NUMBER (10),FWorkYear NUMBER (10) CHECK(FWorkYear< FAge)) 

执行这个SQL语句以后,数据库会报出如下的错误信息:

表 “T_Person” 的列 “FWorkYear” 的列CHECK 约束引用了另一列。

出现这个错误的原因是因为在这种方式定义的CHECK子句中是不能引用其他列的,如果希望CHECK子句中的条件语句中使用其他列,则必须在CREATE TABLe 语句的末尾使用CONSTRAINT 关键字定义它。语法为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CONSTRAINT 约束名 CHECK(约束条件)

重新编写上述的SQL语句,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MYSQL,DB2:

CREATE TABLE T_Person (FNumber VARCHAR(20),FName VARCHAR(20),FAge INT,FWorkYear INT,CONSTRAINT ck_1 CHECK(FWorkYear< FAge)) MSSQLServer: CREATE TABLE T_Person (FNumber VARCHAR(20),FName VARCHAR(20),FAge INT,FWorkYear INT,CONSTRAINT ck_1 CHECK(FWorkYear< FAge)) Oracle: CREATE TABLE T_Person (FNumber VARCHAR2(20),FName VARCHAR2(20),FAge NUMBER (10),FWorkYear NUMBER (10),CONSTRAINT ck_1 CHECK(FWorkYear< FAge)) 

表创建完毕后执行下面的SQL语句进行测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSERT INTO T_Person(FNumber, FName, FAge, FWorkYear) VALUES("001","John",25, 30) 

因为这里将FWorkYear字段设置成了30,比如年龄25岁还大,这是违反“CHECK(FWorkYear<FAge)”这个CHECK约束的,所以在数据库中执行此SQL语句后数据库会报出下面错误信息:

  • INSERT 语句与 CHECK 约束”ck_1″冲突。该冲突发生于数据库”demo”,表”dbo.T_Person”。

而执行下面的SQL语句则可以成功执行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSERT INTO T_Person(FNumber, FName, FAge, FWorkYear) VALUES("001001001001001","John",25,3) 

可以看到,这种定义CHECK约束的方式几乎与定义一个复合唯一约束的方式一致。同样,可以通过ALTER TABLE的方式为已经存在的数据表添加CHECK 约束。下面的SQL语句在T_Person上添加新的约束:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ALTER TABLE T_Person ADD CONSTRAINT ck_2 CHECK(FAge>14) 

上面的SQL语句中为约束指定了显式的名称,所以可以通过下面的SQL语句将CHECK约束ck_2删除(这个语句在MYSQL中无效):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ALTER TABLE T_Person DROP CONSTRAINT ck_2;

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/166713.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深入浅出谈开窗函数(一)
在开窗函数出现之前存在着非常多用 SQL 语句非常难解决的问题,非常多都要通过复杂的相关子查询或者存储过程来完毕。为了解决这些问题,在2003年ISO SQL标准添�了开窗函数,开窗函数的使用使得这些经典的难题能够被轻松的解决。眼下在 MSSQLServer、Oracle、DB2 等主流数据库中都提供了对开窗函数的支持,只是非常遗憾的是 MYSQL 临时还未对开窗函数给予支持。
全栈程序员站长
2021/12/08
9570
SQL基础--> 约束(CONSTRAINT)
约束是表、列级的强制规定、是防止那些无效或有问题的数据输入到表中。当对该表进行DML
Leshami
2018/08/07
1.8K0
Oracle 数据库学习笔记 (二)
示例: 下面段代码的意思是:创建一个表空间,并命名为 my_mobile,表存储的位置为 d盘下的 tableSpace 文件,并命名为 my_module.dbf 文件,大小为 100M,空间满后会自己增加,每次增加 32M,大小没有限制
Gorit
2021/12/09
9760
oracle数据库的常用的命令操作!
Java基础 | 数据库 | Android | 学习视频 | 学习资料下载 最新通知 数据库技术是计算机科学技术的一个重要分支。从20世纪50年代中期开始,计算机应用从科学研究部门扩展到企业管理及政府行政部门,人们对数据处理的要求也越来越高。传统的文件系统已经不能满足人们的需要。 ★回复【数据库工具】获取数据库安装包以及安装视频教程链接 熟记一下单词 select 选择 create 创建 insert 插入 alter 更改 modify 修改 update 更新 drop 删掉 delete 删除
Java学习
2018/04/16
8020
Oracle应用实战四——约束+Scott表结构
约束 在数据库开发中,约束是必不可少,使用约束可以更好的保证数据的完整性。 1 主键约束(掌握) 主键约束都是在id上使用,而且本身已经默认了内容不能为空,可以在建表的时候指定。 创建一张表,把pid作为主键 create table person( pid number(10) primary key, name varchar2(10), gender number(1) default 1, birthday date ); 主键不可重复,
Java帮帮
2018/03/19
1K0
Oracle应用实战四——约束+Scott表结构
Oracle数据库之第三篇
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
海仔
2019/10/22
7030
Oracle创建表空间和表「建议收藏」
Oracle创建表同SQL Server一样,使用CREATE TABLE命令来完成。创建约束则使用如下命令:
全栈程序员站长
2022/09/08
5.9K0
Oracle创建表空间和表「建议收藏」
数据库的检索语句
仅仅要运行“SELECT * FROM 名”就可以。SELECT * FROM T_Employee 。
全栈程序员站长
2022/07/06
2.6K0
数据库的检索语句
SQL学习日记(二)
例如:按照 department_id 查询 employees(员工表)和 departments(部门表)的信息。
量子态的沐子呓
2019/12/25
3560
干货 | Oracle数据库操作命令大全,满满的案例供你理解,收藏!
Oracle是美国ORACLE公司研发的一款关系型数据库,主要特点有:速度快、安全性强、可跨平台,主要版本有:Oracle9i、Oracle10g、Oracle11g、Oracle12c
网络技术联盟站
2020/10/14
3.8K0
Oracle - 数据库对象
视图(view),称为虚表,在数据库中不存在实体。视图本质上是对物理表(基表)的一种数据保护,让开发者或者用户只能看到基表中的部分数据。
Carlos Ouyang
2019/08/19
8120
Oracle - 数据库对象
数据库 SQL 约束之 CHECK
大家好,我是阿常,上一篇阿常讲了《数据库 SQL 约束之 FOREIGN KEY》,今天阿常和大家分享《数据库 SQL 约束之 CHECK》。
程序媛淼淼
2022/09/01
6770
数据库 SQL 约束之 CHECK
oracle--约束(主键、非空、检查)
使用外键约束 --(1)、在字段后使用 references 参照表表名(参照字段) --(2)、在所有字段后使用 constraints fk_表名_字段名 foreign key(字段名) references 参照表名(参照字段名) --(3)、在创建表后使用alter table 表名 add constraints fk_表名_字段名 foreign key(字段名) references 参照表名(参照字段名) --删除外键 alter table 表名 drop constraints fk_表名_字段名
eadela
2019/09/29
2K0
oracle约束条件
http://www.cnblogs.com/lm970585581/p/7076084.html
HUC思梦
2020/09/03
5190
oracle添加not null约束
大家好,又见面了,我是你们的朋友全栈君。在创建表时,为列添加not null约束,形式如下: column_name data_type [constraint constraint_name] not null 其中,constraint constraint_name 表示为约束指定名称。 也可以为已创建的表中添加not null约束,这时就需要使用alter table… modify语句,形式如下: alter table table_name modify column_name [constraint constraint_name] not null;
全栈程序员站长
2022/09/06
8150
数据库的存储过程_数据库的存储过程语句
  2.对于存储过程来说可以返回参数(output),而函数只能返回值或者表对象。
全栈程序员站长
2022/09/21
4.1K0
数据库的存储过程_数据库的存储过程语句
Oracle建表语法
注意:创建表还是约束,与SQL Server基本相同,注意:在Oracle中default是一个值,而SQL Server中default是一个约束,
bboy枫亭
2020/09/22
1.7K0
SDUT数据库 SQL语句练习(MySQL)
customers(customer_id, firstname, lastname, city, address, email) 顾客信息表
Here_SDUT
2022/08/11
3.1K0
SDUT数据库 SQL语句练习(MySQL)
Oracle 数据库学习笔记 (三)
语法:RENAME table_ name TO new_ table_ name;
Gorit
2021/12/09
4030
Web-第二十四天 Oracle学习【悟空教程】
ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。比如SilverStream就是基于数据库的一种中间件。ORACLE数据库是目前世界上使用最为广泛的数据库管理系统,作为一个通用的数据库系统,它具有完整的数据管理功能;作为一个关系数据库,它是一个完备关系的产品;作为分布式数据库它实现了分布式处理功能。但它的所有知识,只要在一种机型上学习了ORACLE知识,便能在各种类型的机器上使用它。
Java帮帮
2018/07/27
1.9K0
Web-第二十四天 Oracle学习【悟空教程】
相关推荐
深入浅出谈开窗函数(一)
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验