热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

确保数据完整性:常见约束机制及其应用

本文探讨了数据完整性的重要性,并详细介绍了其主要分类,包括实体完整性、域完整性、参照完整性和用户定义的完整性。文章还深入分析了几种常见的约束机制,如主键约束(PRIMARYKEY)、非空约束(NOTNULL)等,以及它们在实际应用中的具体作用和实施方法。通过这些内容,读者可以全面了解如何确保数据库中的数据完整性,从而提高数据质量和系统可靠性。


文章目录

  • 数据完整性
    • 定义
    • 分类
      • 1. 实体完整性
      • 2. 域完整性
      • 3. 参照完整性
      • 4. 用户定义的完整性
  • 关于约束
  • 常见的几种约束
    • 1.主键约束 (PRIMARY KEY)
    • 2.非空约束(NOT NULL)
    • 3.自增长约束(AUTO_INCREMENT)
    • 4.非负约束(UNSIGNED)
    • 5.唯一约束(UNIQUE)
    • 6.外键约束(FOREIGN KEY)
    • 7.默认值约束(DEFAULT)
    • 8.检查(CHECK )


数据完整性


定义

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


分类


1. 实体完整性

实体完整性是对关系中的记录唯一性,也就是主键的约束。准确地说,实体完整性是指关系中的主属性值不能为Null且不能有相同值。定义表中的所有行能唯一的标识,一般用主键,唯一索引 unique关键字,及identity属性比如说我们的身份证号码,可以唯一标识一个人.。


2. 域完整性

域完整性是对数据表中字段属性的约束,通常指数据的有效性,它包括字段的值域、字段的类型及字段的有效规则等约束,它是由确定关系结构时所定义的字段的属性决定的。限制数据类型,缺省值,规则,约束,是否可以为空,域完整性可以确保不会输入无效的值.。


3. 参照完整性

参照完整性是对关系数据库中建立关联关系的数据表间数据参照引用的约束,也就是对外键的约束。准确地说,参照完整性是指关系中的外键必须是另一个关系的主键有效值,或者是NULL。参考完整性维护表间数据的有效性,完整性,通常通过建立外部键联系另一表的主键实现,还可以用触发器来维护参考完整性


4. 用户定义的完整性


关于约束

数据库中的约束,顾名思义即是对插入数据库中的数据进行限定,这么做的目的是为了保证数据的有效性和完整性。这样就大幅度地提高了数据库中数据的质量,节省了数据库的空间和调用数据的时间。


常见的几种约束


1.主键约束 (PRIMARY KEY)


  • NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标
    识,有助于更容易更快速地找到表中的一个特定的记录

相当于数据的唯一身份标识.类似于一个人的身份证号码 – 非空且有唯一代
主键是日常使用数据库时,最常使用的约束,也是最重要的约束!!!
创建表的时候,很多时候都需要指定主键
一个表中 只能有一个主键

设置主键的两种方式:

//方式一:
create table 表名(id int(11) primary key,
);//方式二:
create table 表名(id int(11);prinmary key(id)
);

修改表时也可以指定主键:

alter table 表名 add primary key(主键列);

删除主键

alter table 表名 drop primary key;

2.非空约束(NOT NULL)


  • 指示某列不能存储 NULL 值

想一想我们平常在学校填表时,是不是经常遇到表格上有必填项或者选填项,
NOT NULL 就是指定这一列为必填项.

create table student(id int not null, name varchar(20));

在这里插入图片描述
如果尝试向表中插入一个id为"null"的信息,就会报错:
在这里插入图片描述
NOT NULL可以对任意列进行规定:
在这里插入图片描述


3.自增长约束(AUTO_INCREMENT)


  • 因为主键列的特性是:唯一、非空,因此我们通常指定主键列为整型,并且设置其为自动增长,这样可以保证在插入数据时主键列的唯一 ,自增和非空特性。

create table 表名(id int(11) primary key auto_incerment,
);

在这里插入图片描述

当设定好自增主键后,再往表中插入记录,就可以不指定自增主键的值了(直接使用null来表示),他的值就交给mysql自行分配即可
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


4.非负约束(UNSIGNED)


  • 指定某列不可存储负值,添加非负约束后,取值范围将发生变化,例如int范围是-128~127,添加非负约束后将变成0-255

eg:

create table student(name varchar(20), age int unsigned);

在这里插入图片描述
向其中插入记录,age一列如果添加负值,就会报错.
在这里插入图片描述


5.唯一约束(UNIQUE)


  • 保证某列的每行必须有唯一的值

在这里插入图片描述
数据唯一 --如果尝试插入重复的值,就会报错
在这里插入图片描述
但是 他无法对空值进行控制 ----- 输入多个空值并不影响
在这里插入图片描述
想要对空值进行控制还是要借助NOT NULL

在这里插入图片描述


6.外键约束(FOREIGN KEY)


  • 保证一个表中的数据匹配另一个表中的值的参照完整性
    -针对两张表,进行关联(实际上依赖不是以表为单位,而是以列为单位–子表的一列依赖于父表中的一列)

如果我们创建两张表,一张为学生表,另一张为班级表,并将两张表进行关联:学生是属于其中一个班级中的
eg:
在这里插入图片描述
这种情况下,可以用外键约束来描述这种关系: 学生表依赖了班级表 ---- 我们把学生表称为"子表",把班级表称为"父表".

这样,每个同学都要属于一个具体的班级 – 也就是说:这个班级必须是存在的!!!(不需要一对一,只要存在即可)
如果插入记录时,有个学生的记录id是10000,此时这样的数据就是非法的!!

外键约束的创建

//创建班级表
create table class(classid int primary key auto_increment,name varchar(50));//创建学生表,并与班级表关联 指定外键约束
create table students (studentid int primary key auto_increment, name varchar(20),classid int, foreign key (classid) references class(classid));

在这里插入图片描述
外键约束,描述的是两张表的两个列之间的"依赖关系":子表依赖于父表(子表引用父表),要求子表中对应的记录得在父表中存在
在这里插入图片描述
插入操作

在这里插入图片描述
这条记录中,指定的classid为1,在class表中存在,就可以插入成功
在插入之前,mysql会拿着clssid去class表中查找,看看是否存在,存在才能插入成功(这里的查询操作,可能是一个成本较高的操作–比较耗时,外键约束其实要求父表中被依赖的这一列,必须要有索引,有了索引就能大大的提高查询速度) —class表的classid这一列,得是primary key 或者 unique(有了这两个约束的列,就会自动的创建出索引)
在这里插入图片描述

这条记录中,指定的classid为4,在class表中不存在,所以插入失败

修改操作

在这里插入图片描述
在这里插入图片描述

不仅仅是新增时要考虑到外键约束,新增成功的数据进行修改时,也一样会存在问题

在这里插入图片描述

外键约束,不仅约束了子表,同样也约束着父表:当父表中的某个记录被子表中依赖着的时候,此时对父表的删除和修改都会失败

删除操作
在这里插入图片描述

这个删除操作可以完成,因为针对classid=1的记录来说,并没有在student表中被依赖到,所以可以删除
在这里插入图片描述
直接删除整个父表的操作也不能成功


7.默认值约束(DEFAULT)


  • 规定没有给列赋值时的默认值

在MySQL中,默认会统一给一个默认值"NULL"
在这里插入图片描述
在这里插入图片描述
我们也可以通过自定义的方式,设置别的default值
在这里插入图片描述


8.检查(CHECK )


  • 保证列中的值符合指定的条件。对于MySQL数据库,对CHECK子句进行分析,但是忽略CHECK子句

CHECK 约束用于限制列中的值的范围。

如果对单个列定义 CHECK 约束,那么该列只允许特定的值。

如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制

//创建
CHECK(<检查约束>)
//修改
ALTER TABLE tb_emp7 ADD CONSTRAINT <检查约束名> CHECK(<检查约束>)
//删除
ALTER TABLE <数据表名> DROP CONSTRAINT <检查约束名>;

推荐阅读
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
author-avatar
手机用户2502880041
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有