这篇文章讲的是数据库中的数据完整性约束,如有错误或不当之处,还望各位大神批评指正。

什么是数据完整性约束?

数据完整性:存储在数据库中的所有数据值均正确的状态。它是应防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的。

数据完整性分为四类:
1. 实体完整性(实体完整性是对关系中的记录唯一性,也就是主键的约束。准确地说,实体完整性是指关系中的主属性值不能为Null且不能有相同值。定义表中的所有行能唯一的标识,一般用主键,唯一索引 unique关键字,及identity属性比如说我们的身份证号码,可以唯一标识一个人.。)
2. 域完整性(域完整性是对数据表中字段属性的约束,通常指数据的有效性,它包括字段的值域、字段的类型及字段的有效规则等约束,它是由确定关系结构时所定义的字段的属性决定的。限制数据类型,缺省值,规则,约束,是否可以为空,域完整性可以确保不会输入无效的值.。)
3. 参照完整性(参照完整性是对关系数据库中建立关联关系的数据表间数据参照引用的约束,也就是对外键的约束。准确地说,参照完整性是指关系中的外键必须是另一个关系的主键有效值,或者是NULL。参考完整性维护表间数据的有效性,完整性,通常通过建立外部键联系另一表的主键实现,还可以用触发器来维护参考完整性)
4. 用户定义的完整性。

约束是表级的强制规定,有以下五中:not null,unique,primary key,foreign key,check 。

创建约束

非空约束(not null)

not null为列级约束,只能作用在列上
- 新建表std1,字段:id(非空),name(非空),score(可为空)

create table std1 (id number(6) constraint std1_id_nn not null ,name varchar(200) not null,score number(10,2)
)

这事如果在操作时定义为非空的字段为空,则会报错:

唯一约束(unique)

  • 新建表std2,字段:id(唯一),name(非空),score(可为空)
create table std2 (id number(6) constraint std2_id_uk unique ,name varchar(200) constraint std2_name_nn not null,score number(10,2) ,email varchar(20) ,
--表级约束constraint std2_email_uk unique(email)
)

这时,若有唯一约束的字段出现了重复值,则会报错:

注:unique允许多个空值

主键约束(primary key)

  • 新建表std3,字段:id(主键),name(非空),score(可为空)
create table std3 (id number(6) constraint std3_id_pk primary key ,name varchar(200) constraint std3_name_nn not null,score number(10,2) ,email varchar(20) ,
--表级约束constraint std3_email_uk unique(email)
)--或者create table std3 (id number(6) ,name varchar(200) constraint std3_name_nn not null,score number(10,2) ,email varchar(20) ,
--表级约束constraint std3_email_uk unique(email) ,constraint std3_id_pk primary key(id)
)

此时若往主键字段插入空值则:

若主键重复则:

注:一个表只能有一个主键,主键非空且唯一

外键约束(foreign key)

  • 新建表std4,字段:id(主键),name(非空),score(可为空),friend_id(外键关联std3.id)
create table std4 (id number(6) ,name varchar(200) constraint std4_name_nn not null,score number(10,2) ,email varchar(20) ,friend_id number(6) ,
--表级约束constraint std4_email_uk unique(email) ,constraint std4_id_pk primary key(id) ,constraint std4_friend_id_fk foreign key(friend_id) references std3(id)
)

此时,若std4表中插入std3中不存在的id,则报错:

检查约束(check)

  • 新建表std7,字段:id(主键),name(非空),score(值范围为0-100)
create table std7 (id number(6) ,name varchar(200) constraint std7_name_nn not null,score number(10,2) ,email varchar(20) ,
--表级约束constraint std7_email_uk unique(email) ,constraint std7_id_pk primary key(id) ,constraint std7_score_ck check (score >= 0 and score <= 100)
)

此时如果添加数据不在check所约束的范围内则:

添加删除约束

可以往已知表中添加新的约束,使用ALTER TABLE - ADD(MODIFY)语句可以添加约束,

not null约束为列级约束必须使用modify

  • 往表std1的score字段加入非空约束
alter table std1
modify(score number(10,2) not null)
  • 删除表std1中id非空的约束
alter table std1
drop constraint std1_id_nn ;
  • 给表std1的score加入检查约束,要求范围为1-100
alter table std1
add(constraint std1_score_ck check(score>=0 and score<=100)) ;

有效化无效化约束

可以将已有表中的约束有效化或无效化(disabled)。

  • 将表std1中score字段的检查约束std1_score_ck 无效化
alter table std1
disable constraint std1_score_ck ;

此时检查约束将不再有效,可以添加不在check范围的数据。

  • 将表std1中score字段的检查约束std1_score_ck 有效化
alter table std1
enable constraint std1_score_ck ;

此时约束重新生效。

级联删除与级联制空祥例

  1. 级联删除(ON DELETE CASCADE):当父表中的列被删除时,字表中相对应的列也被删除。
  2. 级联制空(ON DELETE SET NULL):当父表中的列被删除时,字表中相对应的列被制空。

表结构及初始数据

std3表结构:

create table std3 (id number(6) ,name varchar(200) constraint std3_name_nn not null,score number(10,2) ,email varchar(20) ,
--表级约束constraint std3_email_uk unique(email) ,constraint std3_id_pk primary key(id)
)

std3中数据如下:

std5表结构(外键级联删除):

create table std5 (id number(6) ,name varchar(200) constraint std4_name_nn not null,score number(10,2) ,email varchar(20) ,friend_id number(6) ,
--表级约束constraint std5_email_uk unique(email) ,constraint std5_id_pk primary key(id) ,constraint std5_friend_id_fk foreign key(friend_id) references std3(id) on delete cascade
)

std5中数据如下:

std6表结构(外键级联删除制空):

create table std6 (id number(6) ,name varchar(200) constraint std6_name_nn not null,score number(10,2) ,email varchar(20) ,friend_id number(6) ,
--表级约束constraint std6_email_uk unique(email) ,constraint std6_id_pk primary key(id) ,constraint std6_friend_id_fk foreign key(friend_id) references std3(id) on delete set null)

std6中数据如下:

级联操作

  • 此时删除std3中‘300001’号数据以后:

std5表:

std6表:

注:级联删除会删除相关联子表中的数据,而级联制空会将子表中相关联的数据制空而不会删除

数据库中的数据完整性约束相关推荐

  1. SQL语言基础:SQL中的数据完整性约束用法

    前言 数据库的完整性是指数据库正确性和相容性,是防止合法用户使用数据库时向数据库加入不符合语义的数据,从而保证了数据库中的数据是正确的,避免非法的更新操作. 1.主键约束 1.1 完整性约束条件 完整 ...

  2. 删除列级完整性约束_MySQL中的数据完整性约束

    原标题:MySQL中的数据完整性约束 作者:Airy 在数据分析之路狂奔,立志成为大咖级人物. 前面已经学习了常用数据类型和表的操作,其中表的操作中提到了数据完整性约束条件,今天来详细说一下各种完整性 ...

  3. 用java向mysql数据库中插入数据为空

    利用java面向对像编程,向数据库中插入数据时.遇到插入的数据为空的情况.在此做一小结: 1.数据库连接正正常 2.sql语句没有问题 3.程序没有报异常 4.代码: import java.util ...

  4. android studio数据库存储数据,如何使用API​​ 23在android studio中的数据库中存储数据?...

    大多数时候我不会发布任何内容,因为我可以在其他帖子中找到我需要的所有内容,但是现在我已经有几天了,您如何在数据库中存储任何内容?这是我的Java代码如何使用API​​ 23在android studi ...

  5. 从oracle9i/92数据库中导出数据至 oracle 8.1.7 数据库中

    根据ORACLE官方文档的说明,一旦数据库创建后,数据库的字符集是不能改变的.因此,提前考虑自己的数据库将选用哪一种字符集 是十分重要的.数据库字符集选择的一般规则是将数据库字符集设定为操作系统本地字 ...

  6. 以使用QSqlQuery向数据库中插入数据为例,做一个小结

    背景: 最近在使用Qt+SQLite写一个本地数据库管理程序(使用者不懂SQL),在写向数据库中插入数据的 相关的函数时,我遇到了几个问题(暂时就这些): 1.向指定字段插入指定数据时,读取到的数据都 ...

  7. c从sqlite3数据库中获取数据,并对数据进行拼接

    c从sqlite3数据库中获取数据,并对数据进行拼接 函数功能 对数据库的操作 创建数据库: 创建USER表: 创建表内数据: 查看表内数据: 查看表结构: 函数实现 函数编译: 函数结果: 函数功能 ...

  8. asp.net学习笔记·将数据库中的数据保存在EXCEL文件中

    提取数据库中的数据,将其保存在EXCEL文件中,并提供下载. 在一般处理程序中将数据库数据保存在EXCEL文件中的代码 using System; using System.Collections.G ...

  9. python3.5链接SQL2017,读取数据库中的数据

    之前写了一个小程序,使用的数据是从数据库中下载出来的,但是现在想要让它直接链接上数据库中,可以直接从数据库中读取数据,所以研究了一下python和sql之间的链接.具体如下: 使用的库为pyodbc ...

最新文章

  1. mysql dba系统学习(19)配置mysql+lvs+keeplived实现Mysql读操作的负载均衡
  2. 内江将被打造成四川物联网西部副中心
  3. Java学习之while语句
  4. ssas 为绑定指定的大小太小,导致一个或多个列值被截断
  5. Windows7操作系统任务栏的相关技巧
  6. Comsenz 核心产品 Discuz! X3.3 正式版【2017-07-01】 -论坛搭建
  7. 郑州大学远程教育学院C语言程序设计题库(一)
  8. 构建LALR(1)项目集族
  9. linux将pdf转txt,如何快速把PDF转换成TXT
  10. MSTAR数据集的SAR图像识别 准确率99.17%
  11. 干货!史上最全数据分析学习路线(附资源链接)
  12. java上传文件怎么设置成777权限,777权限的改法是怎样的 将文件权限修改为777图文教程...
  13. 各种github浏览器无法访问问题
  14. LeetCode - 1217 - 玩筹码(play-with-chips)
  15. [蓝屏]driver_unloaded_without_cancelling_pending_operations
  16. Dao,Service,Controller层作用
  17. 《设计模式》——开闭原则
  18. Easy3DCGAL 凸包算法(三维)
  19. 从shape类扩展出一个正五边形类(求五边形的面积和周长)----java
  20. 计算机数字编码表示有,计算机中数字、文字、图像、声音和视频的表示与编码...

热门文章

  1. 坐标系转换-大地坐标转笛卡尔坐标系,笛卡尔坐标系转东北天坐标系
  2. “海盗湾”副本网站上线:IPFS分布式技术搭建
  3. 自己动手写一个操作系统——MBR(1)
  4. 计算机没有开启还原的功能,win10系统无法开启系统还原功能的详细教程
  5. DBA与项目的那堆事 ——目录
  6. 433_ev1527发送端驱动
  7. 20180117资金净流入排行榜
  8. 深度学习之 DCGAN 及TensorFlow 实现
  9. 计算机网络- Internet是如何工作的
  10. 广州的房价是我遥不可及的梦,今天就用Python来做一个房价预测小工具