五、SQL–索引/约束④(check约束)
CHECK约束会:
检查输入到记录中的值是否满足一个条件,如果不满足这个条件则对数据库做的修改不会成功。
如,一个人的年龄是不可能为负数的,一个人的入学日期不可能早于出生日期,出厂月份不可能大于12。可以在CHECK条件中使用任意有效的SQL表达式,CHECK约束对于插入、更新等任何对数据进行变化的操作都进行检查。
字段添加CHECK约束:在该字段定义后添加CHECK 表达式,几乎所有字段中都可以添加CHECK约束,即一张表中可以存在多个CHECK 约束。
数据准备:
创建了一张用于保存人员信息的表T_Person,其中字段FNumber 为人员编号,字段FName 为人员姓名,字段FAge为人员年龄,字段FWorkYear为人员工龄:
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语句进行测试:
INSERT INTO T_Person(FNumber, FName, FAge, FWorkYear) VALUES("001","John",25,-3)
执行此SQL语句后数据库会报出下面错误信息:
INSERT 语句与CHECK 约束"CK__T_Person__FWorkY__24927208"冲突。该冲突发生于数据库"demo",表"dbo.T_Person", column "FWorkYear"。
执行下面的SQL语句则可以成功执行:
INSERT INTO T_Person(FNumber, FName, FAge, FWorkYear) VALUES("001","John",25,3)
可在CHECK 约束中使用函数
如:人员编号长度要大于12,那么就需要如下编写建表语句:
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语句进行测试:
INSERT INTO T_Person(FNumber, FName, FAge, FWorkYear) VALUES("001","John",25, 3)
将FNumber字段设置成了"001",是违反“CHECK(LENGTH(FNumber)>12)”这个CHECK约束的,所以执行此SQL语句后数据库会报出下面错误信息:
INSERT 语句与CHECK 约束"CK__T_Person__FNumbe__267ABA7A"冲突。该冲突发生于数据库"demo",表"dbo.T_Person", column "FNumber"。
而执行下面的SQL语句则可以成功执行:
INSERT INTO T_Person(FNumber, FName, FAge, FWorkYear)VALUES("001001001001001","John",25,3)
直接在列定义中通过CHECK子句添加CHECK约束的方式的缺点是约束条件不能引用其他列。
如:约束“人员的工龄必须小于他的年龄”,执行下面的SQL语句:
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))
执行后,数据库会报出如下的错误信息:
表 "T_Person" 的列 "FWorkYear" 的列CHECK 约束引用了另一列。
若希望CHECK子句中的条件语句中使用其他列,则必须在CREATE TABLe 语句的末尾使用CONSTRAINT 关键字定义它。语法为:
CONSTRAINT 约束名 CHECK(约束条件)
重新编写上述的SQL语句,如下:
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语句进行测试:
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语句则可以成功执行:
INSERT INTO T_Person(FNumber, FName, FAge, FWorkYear) VALUES("001001001001001","John",25,3)
这种定义CHECK约束的方式几乎与定义一个复合唯一约束的方式一致。通过ALTER TABLE的方式为已经存在的数据表添加CHECK 约束。
如:在T_Person上添加新的约束:
ALTER TABLE T_Person ADD CONSTRAINT ck_2 CHECK(FAge>14)
上面的SQL语句中为约束指定了显式的名称,所以可以通过下面的SQL语句将CHECK约束ck_2删除(这个语句在MYSQL中无效):
ALTER TABLE T_Person
DROP CONSTRAINT ck_2;
http://www.taodudu.cc/news/show-6373228.html
相关文章:
- ORACLE- check 检查约束
- 陶哲轩career advice 翻译
- 陶瓷天线的选型(二)
- 计算机工程陶瓷,捏陶瓷之形,赏中华之美
- 如何从电压范围75V-3500V中选购合适的GDT-陶瓷气体放电管-优恩
- 看APS计划排产在陶瓷制品行业的应用
- 陶泓达:周五黄金原油白银走势分析及操作建议
- 陶泓达:最新黄金,原油短线交易策略!
- 陶泓达:本周最新走势分析及操作建议
- MJExtension使用指导
- 陶泓达:实力指导短线交易策略!让你翻仓回本
- 再见陶指导
- RecyclerView的万能分割线
- Android 分割线
- Vue3分割线(Divider)
- 质数/素数筛选c++超简单版写法
- 双素数(质数)C语言程序详解
- 统计找出一千万以内,一共有多少质数?(优化过程,效率更快)
- (free)Windows下的stegdetect下载链接
- 解决esp-idf-5.0编译时报错:Component “tinyusb“ does not support target esp32
- ESP32 E (10309) task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdo
- windows平台下安装ES
- Windows下安装ES
- ESP32 强制门户 WEB配网
- ESP32 ESP-IDF安装教程(windows 64位)
- windows 安装es环境,手把手教学
- ESET(NOD32) ESS/EAV 4.0.424.0 BE 32位 汉化正式版
- TFT-eSPI 库在 ESP32 上的配置和使用(ESP32 for Arduino)
- windows使用es的客户端es-head
- 使用Aruino Ethernet使ESP32具有以太网通讯能力
五、SQL–索引/约束④(check约束)相关推荐
- SQL语法之 CHECK 约束
SQL学习 学习SQL语法 SQL语法 SQL学习 SQL语法之 CHECK 约束 SQL CHECK Constraint on CREATE TABLE SQL CHECK Constraint ...
- SQL学习之check约束
目录 参考源 SQL check 约束 示例数据 create table 添加 check 约束 多个字段添加约束 给 check 约束命名 alter table 时的 SQL check 约束 ...
- oracle check 日期大于,sql – 出生日期的CHECK约束?
检查约束必须是确定性的.也就是说,特定行必须始终满足约束,否则它必须始终无法满足约束.但是,由于返回值不断变化,因此SYSDATE本质上是不确定的.因此,您无法定义调用SYSDATE或任何其他用户定义 ...
- mysql删除check约束_高级SQL特性——约束与索引
一.约束 1.约束的作用 对表中数据进行进一步限制,保证表中数据的完整性.一致性和正确性. 2.约束的分类 1)主键约束 主键能够唯一地标识表中的一行,比如学生表中的学生id. 它的主要作用就是能够将 ...
- SQL约束(主键约束 primary key、外键约束 foreign key、唯一约束unique 、CHECK约束)
注意: A.表中有数据不能创建约束 B.视图下设置后,要点击保存(只有保存后在才看的到) c 别忘了,点刷新,才会出来呀! 1.主键约束 primary key 主键是每行的唯一标识符,仅仅通过它 ...
- SQL CHECK 约束
SQL CHECK 约束 CHECK 约束用于限制列中的值得范围. 如果对单个定于的CHECK 约束,那么该列只允许特定的值. 如果对一个表定于CHECK 约束,那么此约束会基于行中其他列的值在特定的 ...
- SQL语句 SQL Server(代码添加约束:主键约束,外键约束,默认值约束,check约束,规则约束)
SQL语句(基于SQL Server) 约束 primary约束,unique约束,check约束 建表时 列级 create table <table name>(<column_ ...
- Oracle修改check约束的sql语句
开始想修改这张表的其中一个字段的约束 check约束,百度各种说不能修改check约束??只能删掉了约束,再重新修改约束.经过各种测试得出,oracle是可以修改check约束,但是也是必须需要删掉原 ...
- Oracle表字段check语句,sql语句大全之SQL CHECK 约束
SQL CHECK 约束 SQL CHECK 约束 CHECK 约束用于限制列中的值的范围. 如果对单个列定义 CHECK 约束,那么该列只允许特定的值. 如果对一个表定义 CHECK 约束,那么此约 ...
最新文章
- 成都工业学院计算机工程学院院长,青春的交接礼——成都工业学院计算机工程学院...
- 在项目中谨慎为系统类添加分类!!!!!
- 对于指针与malloc函数关系的研究,以及指针的赋值。
- 谈谈对IOC及DI的理解与思考
- 深拷贝与浅拷贝Object.assign()
- python自动保存图片_Python学习笔记:利用爬虫自动保存图片
- python案例实操_用案例实操学习Python ,培养编程逻辑思维
- 【python基础】window下python安装及配置环境变量的方法教程
- kakfa怎么看消息是否堆积_不停的打开微信,只为看你是否更新了消息
- CDH 5.15.2 离线安装
- C# WebApi Xml序列化问题解决方法:“ObjectContent`1”类型未能序列化内容类型“application/xml;charset=utf-8“的响应正文。...
- Ubuntu14.04上安装Jupyter的方法
- CSS3动画入门 CSS动画如何使用(举例说明)
- vim高亮多处,搜索多个关键词
- 华为鸿蒙到底是不是安卓系统套了个壳?
- 求素数的python程序,Python-求素数程序
- FPGA芯片的GTX/GTH/GTY/GTP/GTZ/GTM高速信号有什么区别?
- 老问题新解法——经典的大兔子生小兔子问题(斐波那契数列)
- PLC编程实例及经验设计法详解
- IDEA 搭建黑马品优购商城
热门文章
- 多尺度量子谐振子优化算法(MQHOA)-matlab实现demo
- Android studio 模拟器中只能输入英文 如何输入中文
- 写好标题 N倍提升你的IP
- 解决方案 | 亚洲诚信助力互联网行业网络安全建设
- Content-Type四种常见取值application/x-www-form-urlencoded,multipart/form-data,application/json,text/xml
- 女朋友过生日,男子买了一条项链,女友:值不了多少钱
- 还不明白什么是固件吗
- lintcdoe: Number of Airplanes in the Sky
- 【Mathematica】 泰勒展开
- 一个真正的IT人来谈中国与印度的软件