热门标签 | 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习题,本期重点是巩固MySQL多表查询的基础。具体操作包括创建一个名为`day09_exercise`的数据库,以帮助读者更好地理解和实践相关知识点。通过这一练习,读者可以进一步提升对多表查询的理解和应用能力。 ... [详细]
  • 在处理MySQL递归查询父子节点时,若遇到“此函数未声明为DETERMINISTIC、NOSQL或READS SQL DATA”的错误,可以通过以下方法解决:首先,确保表结构正确设计,包含必要的字段用于存储节点关系。接着,创建两个函数,一个用于根据输入ID查询所有子节点及其ID,另一个用于根据输入ID查询所有父节点及其ID。在创建函数时,需明确声明函数的特性,如是否确定性、是否访问SQL数据等,以避免上述错误。调用这些函数时,确保传递正确的参数,并检查返回结果的完整性。 ... [详细]
  • MySQL 8.0 中的二进制日志格式详细解析及其官方文档参考。本文介绍了MySQL服务器如何使用不同的日志记录格式来记录二进制日志,包括早期版本中基于SQL语句的复制机制(即基于语句的日志记录)。此外,还探讨了其他日志记录方式,如基于行的日志记录和混合日志记录模式,并提供了配置和管理这些日志格式的最佳实践。 ... [详细]
  • MySQL 中的内连接、左外连接、右外连接及全外连接详解
    本文通过两个示例表 `a_table` 和 `b_table`,以 `a_table.a_id` 和 `b_table.b_id` 作为关联字段,详细介绍了 MySQL 中的内连接、左外连接、右外连接以及全外连接的概念和使用方法。文章不仅解释了每种连接类型的原理,还提供了具体的 SQL 查询示例,帮助读者更好地理解和应用这些连接方式。 ... [详细]
  • 在使用 PHP 通过 SSL 安全连接到 MySQLi 数据库服务器时,遇到了一些技术难题。我的环境包括一个 Web 服务器和一个数据库服务器,两者均使用 OpenSSL 生成了证书。尽管证书内容一致,但在尝试从 Web 服务器使用 `mysql` 命令进行连接时,仍然遇到了问题。为了确保连接的安全性和稳定性,需要进一步检查证书配置和 PHP 的 SSL 设置,以排除潜在的配置错误或兼容性问题。 ... [详细]
  • MySQL 5.6 引入了全局事务标识符(GTID)和多线程复制机制,显著提升了数据库的可靠性和性能。GTID 作为一种新的事务标识方式,确保了事务在主从节点间的一致性,避免了传统基于日志位置的复制可能出现的问题。多线程复制则通过并行处理多个复制任务,大幅提高了复制效率,特别是在大型数据库环境中表现更为突出。这些新特性不仅增强了 MySQL 的高可用性和扩展性,还为数据库管理带来了更多灵活性和便利性。 ... [详细]
  • 在安装 Greenplum 的过程中,正确配置 `gpinitsystem_config` 文件是至关重要的一步。本文详细介绍了如何优化该文件,以确保数据库集群的高效初始化和稳定运行。通过调整关键参数,用户可以更好地适应不同的硬件环境和业务需求,从而提升系统的整体性能。 ... [详细]
  • 程序连接MySQL数据库的多种方法详解 ... [详细]
  • 本文深入探讨了 AdoDataSet RecordSet 的序列化与反序列化技术,详细解析了将 RecordSet 转换为 XML 格式的方法。通过使用 Variant 类型变量和 TStringStream 流对象,实现数据集的高效转换与存储。该方法不仅提高了数据传输的灵活性,还增强了数据处理的兼容性和可扩展性。 ... [详细]
  • Mysql进阶学习(三)排序查询与常见函数
    Mysql进阶学习(三)排序查询与常见函数一、进阶3:排序查询1、语法:2、特点:3、排序方式3.1、按单个字 ... [详细]
  • 深入解析MySQL Replication中的并行复制机制与实例应用【MySQL进阶教程】
    本文深入探讨了MySQL 5.6版本后引入的并行复制机制,详细解析了其工作原理及优化效果。通过具体实例,展示了如何在实际环境中配置和使用并行复制,以提高数据同步效率和系统性能。 ... [详细]
  • 深入解析Android中图像资源的内存占用问题及其优化策略
    在Android开发过程中,图像资源的内存占用是一个值得关注的问题。本文将探讨图像内存占用与哪些因素相关,包括设备性能的影响,并提供一系列优化策略,帮助开发者有效管理图像资源,提升应用性能。 ... [详细]
  • 在 Linux 环境下,深入探讨 GTK+3.0 的高级开发技巧,涵盖组件定制、事件处理及多线程应用等核心内容,帮助开发者提升应用界面的交互性和性能。 ... [详细]
  • OpenCV 2.4.9 源码解析:级联分类器的错误率与尺寸分析 ... [详细]
  • 在MySQL权限管理实践中,新安装的MySQL系统可能会遇到连接问题,如root用户无法访问。本文总结了相关解决方案,包括如何创建新账户(例如:用户名为test,密码为12),并详细介绍了权限分配和管理的策略,以确保系统的安全性和稳定性。 ... [详细]
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社区 版权所有