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

CHECK约束_数据库check约束怎么写CHECK约束会检查输入到记录中的值是否满足一个条件,如果不满足这个条件则对数据库做的修改不会成功。比如,一个人的年龄是不可能为负数的,一个人的入学日期不可能早于出生日期,出厂月份不可能大于12。可以

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

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

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

下面的SQL语句创建了一张用于保存人员信息的表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) 

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

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

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


INSERT INTO T_Person(FNumber, FName, FAge, FWorkYear) VALUES("001","John",25,3) 

除了可以在CHECK 约束中使用常量表达式之外,还可以在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 约束”CKT_PersonFNumbe__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)) 

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

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

出现这个错误的原因是因为在这种方式定义的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 约束。下面的SQL语句在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;
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 微信小程序页面跳转 回退页面api

    微信小程序页面跳转 回退页面api小程序如果 跳转url后 需要直接返回首页或者回退之前好几个页面,跳转url时用 wx.redirectTo设置好回退的参数即可。如果返回上一页时 跳转url时用 wx.navigateTo

    2022年8月19日
    4
  • 版本号命名规则_文件版本号命名规则

    版本号命名规则_文件版本号命名规则版本号的格式为X.Y.Z(又称Major.Minor.Patch),递增的规则为:X表示主版本号,当API的兼容性变化时,X需递增。Y表示次版本号,当增加功能时(不影响API的兼容性),Y需递增。Z表示修订号,当做Bug修复时(不影响API的兼容性),Z需递增。详细的规则如下:X,Y,Z必须为非负整数,且不得包含前导零,必须按数值递增,如1….

    2025年10月25日
    4
  • 内存屏障 – MemoryBarrier[通俗易懂]

    内存屏障 – MemoryBarrier[通俗易懂]处理器的乱序和并发执行目前的高级处理器,为了提高内部逻辑元件的利用率以提高运行速度,通常会采用多指令发射、乱序执行等各种措施。现在普遍使用的一些超标量处理器通常能够在一个指令周期内并发执行多条指令。处理器从L1I-Cache预取了一批指令后,就会分析找出那些互相没有关联可以并发执行的指令,然后送到几个独立的执行单元进行并发执行。比如下面这样的代码(假定编译器不做优化):  z

    2022年7月12日
    20
  • java的大数运算(高新技术产品有哪些)

    java的大数运算(高新技术产品有哪些)本篇博客主要介绍Java常用类库之大数操作,主要是BigInteger和BigDecimal的API学习。之后介绍华为的一道历年真题,十六进制转换成十进制,我们可以看到题目中给我们设置的陷阱,以及如何解决它!

    2022年4月18日
    55
  • js如何获取计算机当前时间,js获取当前系统时间实例代码

    js如何获取计算机当前时间,js获取当前系统时间实例代码在javascript中使用date日期函数,取得当前系统时间的方法:varmydate=newdate();mydate.getyear();//获取当前年份(2位)mydate.getfullyear();//获取完整的年份(4位,1970-????)mydate.getmonth();//获取当前月份(0-11,0代表1月)mydate.getdate();…

    2022年10月18日
    2
  • 双面小册子–WORD文档打印

    双面小册子–WORD文档打印拿到一个文档,有几十页,很大,于是想打印出来看,使用A4纸张整篇幅打印过于浪费,偶然看到同事拿到一个小册子,于是学习了一下打印方法,如下:打印–打印机属性–完成中选择双面打印–小册子打印–A4装订即可。 可以像书一样打印你所需要的文档,可以节省很多纸。纠结了一下才学会,度娘提了问题都没有结果,可算处理掉了。

    2025年9月21日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号