数据库原理与应用笔记(五):数据库完整性

简介: 数据库完整性

5.1实体完整性

5.1.1定义实体完整性

5.1.2实体完整性检查和违约处理

5.2参照完整性

5.2.1定义参照完整性

5.2.2参照完整性检查和违约处理

5.3用户定义的完整性

5.3.1属性上的约束条件

5.3.2元组上的约束条件

5.4完整性约束命名字句

5.5断言

5.6触发器

5.6.1定义触发器

5.6.2激活触发器

5.6.3删除触发器


5.1实体完整性

数据库的完整性integrity是指数据的正确性和相容性

数据的正确性是指数据是符合现实世界语义、反映当前实际状况的;数据的相容性是指数据库同一对象在不同关系表中的数据是符合逻辑的


什么是正确性?

学生属性组{学号,性别}中的性别只能是男或者女,不能是不男不女,这就是正确性

什么是相容性?

学生属性组的学号在专业课程属性组{专业课程号,学号}也是表达的是学号,不会变成其他班级座号等信息,这就是相容性


为了维护数据库的完整性,数据库管理系统必须能够实现如下功能:

1提供定义完整性约束条件的机制

完整性约束条件也称为完整性规则,是数据库中的数据必须满足的语义约束条件。SQL标准提供了一系列概念来描述完整性,包括关系模型的实体完整性、参照完整性和用户定义完整性。


2提供完整性检查的方法

数据库管理系统中检查是否满足完整性约束条件的机制称为完整性检查


3进行违约处理

如果系统发现了用户违法了完整性约束条件,将会拒绝执行该操作**(NO ACTION)或级联(CASCADE)**执行其他操作


关系数据库管理系统使得完整性控制成为其核心支持的功能,从而能够为所有用户和应用提供一致的数据库完整性


5.1.1定义实体完整性

关系模型的实体完整性在CREATE TABLE中用PRIMARY KEY定义。


对单属性构成的码有两种说明方法:

定义为列级约束条件

定义为表级约束条件

对多属性构成的码只有一种说明方法:

定义为表级约束条件

例如:定义为列级约束条件20200622104254969.png

定义为表级约束条件

20200622104339985.png

5.1.2实体完整性检查和违约处理

关系数据库管理系统将按照实体完整性规则(在笔记二中有介绍)自动进行进检查,包括:

(1)检查主码值是否唯一,如果不唯一则拒绝插入或修改
(2)检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改


5.2参照完整性

5.2.1定义参照完整性


关系模型用参照完整性在CREATE TABLE中用FOREIGN KEY短语定义哪些列为外码,用REFERENCES短语来指明这些外码参照哪些表的主码

例如20200622105813806.png

5.2.2参照完整性检查和违约处理

参照完整性是把两个表中相应元组联系起来,对被参照表和参照表进行增、删、改操作时可能破坏参照完整性,必须进行检查以保证两个表的相容性

例如

20200622110116950.png

当上述的不一致发送时,系统可以采用以下策略加以处理

(1)拒绝no action执行

不运行执行该操作

(2)级联cascade操作

删除或修改所有不一致的元组

(3)设置为空值

设置为空值需要考虑外码是否接受空值

例如在学生属性组中学号为主码,在专业课程属性组中学号为外码,能不能把学号设置为空值呢?答案是不可以,**为什么?**因为学号同样是专业课程属性组的主属性,没了学号,即表示没有这个学生或者这个学生没有选这个专业课,这是与学校设定不符合的


20200622110653370.png


5.3用户定义的完整性

用户定义的完整性就是针对某一具体应用的数据必须满足的语义要求

5.3.1属性上的约束条件

1属性上约束条件的定义

在CAREATE TABLE中定义属性的同时,可以设置条件约束,包括:

①列值非空(NOT NULL)

20200622111016733.png

②列值唯一(UNIQUE)

2020062211103452.png

③检查列值是否满足一个条件表达式(CHECK)20200622111046652.png

2属性上约束条件的检查和违约处理

当往表中插入元组或修改属性的值时,关系数据库管理系统将检查属性上的约束条件是否被满足,如果不满足则操作被拒绝执行


5.3.2元组上的约束条件

1元组上约束条件的定义(和属性上约束类似,用CHECK)20200622111337429.png

2元组上约束条件的检查和违约处理

当往表中插入元组或修改属性的值时,关系数据库管理系统将检查属性上的约束条件是否被满足,如果不满足则操作被拒绝执行


5.4完整性约束命名字句

SQL在CREATE TABLE语句中提供了完整性约束命名子句CONSTRAINT,用来对完整性约束条件命名


1完整性约束命名子句

CONSTRAINT<完整性约束条件名><完整性约束条件>

<完整性约束条件>包括NOT NULL、UNIQUE、PRIMARY KEY、FOREIGN KEY、CHECK短语等

例如20200622111721613.png

2修改表中的完整性限制

可以用ALTER TABLE语句修改

例如20200622111839120.png

5.5断言

在SQL中可以使用数据定义语言中的CREATE ASSERTION语句,通过声明性断言来指定更具一般性的约束。断言创建后,任何对断言中所涉及的关系的操作都会触发关系数据库管理系统对断言的检查,任何使断言不为真值的操作都会被拒绝执行


1创建断言的语句格式
CREATE ASSERTION<断言名>

20200622112533680.png

2删除断言的语句格式
DROP ASSERTION<断言名>

5.6触发器

触发器trigger是用户定义在关系表上的一类由事件驱动的特殊过程

激发触发器后触发器会保存在服务器中,任何用户的增删改操作都会激活相应的触发器。

5.6.1定义触发器

触发器又叫做事件-条件-动作(event-condition-action)规则

SQL使用CREATE TRIGGER来建立触发器,其语法格式一般为20200622112950983.png

下列是有关部分语法的详细说明(什么是什么,做什么的)

20200622113110978.png20200622113123388.png

20200622113134987.png

2020062211315213.png

例子如下20200622113217791.png

5.6.2激活触发器

触发器的执行是由触发事件激活,并由数据库服务器自动执行的。在触发器激活时遵循如下的执行顺序:

①执行该表上的BEFORE触发器
②激活触发器上的SQL语句
③执行该表上的AFTER触发器

激活before触发器还是比较抽象的,笔者在这里对学习笔记进行理解性的补充。因为创建了触发器后这个触发器就存在服务器里,所以当进行增删改等操作之前时,会自动激活触发器。**之前时不就没操作吗,它怎么触发?**请注意,触发事件是insert/delete/update,可以这样理解,你在修改某个东西之后,还没执行操作(比如计算机的一个属性窗口,你输入数据之后,你要点击应用,它才会执行操作,也就是你输入数据还没有点击应用的时候),它就会触发了


5.6.3删除触发器

删除触发器的SQL语法如下:
DROP TRIGGER<触发器名>ON<表名>

触发器必须是一个已经创建的触发器,并且只能由具有相应权限的用户删除


笔记使用教材:《数据库系统概论》 王珊 萨师煊 编著
视频课:中国大学MOOC 中国人民大学 数据库系统概论


























相关实践学习
体验RDS通用云盘核心能力
本次实验任务是创建一个云数据库RDS MySQL(通用云盘),并通过云服务器ECS对RDS MySQL实例进行压测,体验IO加速和IO突发带来的性能提升;并通过DMS执行DDL,将数据归档到OSS,再结合云盘缩容,体验数据归档带来的成本优势。
相关文章
|
17天前
|
缓存 NoSQL 数据库
运用云数据库 Tair 构建缓存为应用提速,完成任务得苹果音响、充电套装等好礼!
本活动将带大家了解云数据库 Tair(兼容 Redis),通过体验构建缓存以提速应用,完成任务,即可领取罗马仕安卓充电套装,限量1000个,先到先得。邀请好友共同参与活动,还可赢取苹果 HomePod mini、小米蓝牙耳机等精美好礼!
|
24天前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
40 3
|
24天前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
45 2
|
1月前
|
XML 存储 数据库
XML在数据库中有哪些应用?
【10月更文挑战第17天】XML在数据库中有哪些应用?
33 2
|
1月前
|
供应链 数据库
数据库事务安全性控制有什么应用场景吗
【10月更文挑战第15天】数据库事务安全性控制有什么应用场景吗
|
14天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
29 1
|
16天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
30 4
|
1月前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
64 3
Mysql(4)—数据库索引
|
23天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
118 1
|
25天前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
77 2
下一篇
无影云桌面