CHECK约束

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://www.cnblogs.com/yuyu666/p/9823696.html

时间: 2024-11-05 20:46:04

CHECK约束的相关文章

SQL PRIMARY KEY 约束\SQL FOREIGN KEY 约束\SQL CHECK 约束

SQL PRIMARY KEY 约束 PRIMARY KEY 约束唯一标识数据库表中的每条记录. 主键必须包含唯一的值. 主键列不能包含 NULL 值. 每个表都应该有一个主键,并且每个表只能有一个主键. SQL PRIMARY KEY Constraint on CREATE TABLE 下面的 SQL 在 "Persons" 表创建时在 "Id_P" 列创建 PRIMARY KEY 约束: MySQL: CREATE TABLE Persons ( Id_P i

Partition table的switch条件2:Partition 的隐式Check约束 和Nullability

Partition column允许为Null,Null是最小值,存在于Partition Number=1的partition中. Any data with a NULL in the partition column will reside in the leftmost partition. NULL is considered smaller than the minimum value of the data type’s values. Partition Function 定义了

MariaDB10.2.X-新特性2-支持check约束and with as

前几天写了一篇MariaDB10.2支持分析函数,大家印象中MySQL不支持with as ,check约束,那么MariaDB10.2也同样给你惊喜 1.with as MariaDB [test11]> with a as ( select * from t1 where channerId ='支付宝' )  select * from a; +----+--------+------------+-----------+--------+ | id | userId | orderId 

Oracle之Check约束实例详解

Oracle | PL/SQL Check约束用法详解 1. 目标 实例讲解在Oracle中如何使用CHECK约束(创建.启用.禁用和删除) 2. 什么是Check约束? CHECK约束指在表的列中增加额外的限制条件. 注: CHECK约束不能在VIEW中定义. CHECK约束只能定义的列必须包含在所指定的表中. CHECK约束不能包含子查询. 3. 创建表时定义CHECK约束 3.1 语法: CREATE TABLE table_name ( column1 datatype null/not

数据(连接查询、纵向联合、索引/键、CHECK约束)

-----连接查询----- ---纵向联合--- 索引/键 添加-列-确定 CHECK约束:规定他范围,不能超过范围 stable表-设计-cid右键-CHECK约束-添加-表达式后面的省略号 - 设置为年龄大于0,小于150,超过设置范围语句与约束冲突终止

oracle的check约束

check约束是指检查性约束,使用check约束时.将对输入的每个数据进行检查,仅仅有符合条件的记录才会被保存到表中,从而保证了数据的有效性和完整性. check约束既有下面的四个特点: 在check约束的表达式中,必须引用表中的一个或多个列,而且表达式的运算结果是一个布尔值. 在一个列种.能够定义多个check约束. 对于同一列,能够同一时候定义check约束和not null约束. check约束既能够定义在列级别中.也能够定义在表级中. 在这里.我们创建了一个p3表作为示范: SQL> c

SQL Server中使用Check约束提升性能

在SQL Server中,SQL语句的执行是依赖查询优化器生成的执行计划,而执行计划的好坏直接关乎执行性能. 在查询优化器生成执行计划过程中,需要参考元数据来尽可能生成高效的执行计划,因此元数据越多,则执行计划更可能会高效.所谓需要参考的元数据主要包括:索引.表结构.统计信息等,但还有一些不是很被注意的元数据,其中包括本文阐述的Check约束. 查询优化器在生成执行计划之前有一个阶段叫做代数树优化,比如说下面这个简单查询: 图1.简单查询 查询优化器意识到1=2这个条件是永远不相等的,因此不需要

(六)mysql:在w3schools文档上学习sql语法(check约束)

(一)CHECK 1. CHECK约束用于限制填入数据的范围 当CHECK用于表中的某一列时,它只限制该列的数据 当CHECK用于一张表时 2.语法:MySQL 1.直接在创建表时使用CHECK(constraints) 2.为已创建的表增添CHECK 2.1单个条件 2.2多个条件 3.舍弃check约束

mysql的check约束问题

mysql手册中写道:存储引擎会解析check子句,但是会把它忽略掉 The CHECK clause is parsed but ignored by all storage engines. 现在还没找到check约束开启的东西,但找到了解决办法: mysql> delimiter // mysql> CREATE TRIGGER trig_sd_check BEFORE INSERT ON Customer -> FOR EACH ROW -> BEGIN -> IF

oracle之check约束小结

一下是Ocp考试指导中,对于oracle约束的描述: The constraint types supported by the Oracle database are as follows:UNIQUENOT NULLPRIMARY KEYFOREIGN KEYCHECKConstraints have names. It is good practice to specify the names with a standard naming convention, but if they a