五、SQL–索引/约束④(check约束)

作者: 小小一颗卤蛋 | 来源:发表于2020-04-23 23:47 被阅读0次

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;

相关文章

  • 五、SQL–索引/约束④(check约束)

    CHECK约束会: 检查输入到记录中的值是否满足一个条件,如果不满足这个条件则对数据库做的修改不会成功。如,一个人...

  • MySQL深度知识四(摘自sql官方文档)

    SQL CHECK 约束CHECK 约束用于限制列中的值的范围。如果对单个列定义 CHECK 约束,那么该列只允许...

  • 五、SQL–索引/约束⑤(主键约束)

    第一范式要求每张表都要有主键,因此主键约束是非常重要的,而且*主键约束是外键关联的基础条件。主键约束为表之间的关联...

  • 五、SQL—索引/约束①

    在数据库系统中解决问题的技术就是索引与约束。索引用来提高数据的检索速度约束则用来保证数据的完整性 索引 索引是建立...

  • 五、SQL–索引/约束②(非空约束)

    在定义数据表的时候,默认情况下所有字段都是允许为空值的,如果需要禁止字段为空,那么就需要在创建表的时候显示指定。指...

  • 五、SQL–索引/约束⑥(外键约束)

    引出:当一些信息在表中重复出现时,就要考虑要将它们提取到新的表中,并在源表中引用新创建的中的数据。 如:很多作者都...

  • 添加SQL check约束

    在数据库中,录入的数据必须规范。否则的话,会给数据管理和应用带来很多麻烦。所以,很有必要使用CHECK 约束限制列...

  • 五、SQL–索引/约束③(唯一约束)

    唯一约束又称为UNIQUE约束,它用于防止一个特定的列中两个记录具有一致的值如:在员工信息表中希望防止两个或者多个...

  • 初学oracle

    约束: 非空约束:not null 唯一约束:unique 检查约束:check 主键约束:primary ke...

  • mysql约束

    1, mysql 不支持外键约束 ,条件约束约束分为列级约束,primary 主键约束check 条件约束for...

网友评论

    本文标题:五、SQL–索引/约束④(check约束)

    本文链接:https://www.haomeiwen.com/subject/vvetwhtx.html