【数据库概论】第五章 数据库完整性

news2025/1/15 17:32:58

第五章 数据库完整性

目录

  • 第五章 数据库完整性
    • 5.1 实体完整性
    • 5.2 参照实体性
    • 5.3 用户定义的完整性
      • 1.属性上的约束条件
      • 2.元组上的约束条件
    • 5.4 完整性约束命名子句
    • 5.5 域中的完整性限制
    • 5.6 断言
    • 5.7 触发器(Trigger)
      • 一、定义触发器
      • 二、激活触发器
      • 三、删除触发器

数据库的完整性指的是数据的正确性和相融性。数据的正确性是指符合现实世界语意、反映当前实际情况啊;数据的相容性指的是数据库对同一对象在不同关系表中的数据是符合逻辑的,比如学生的学号一定是唯一的,学生所属的专业一定是专业表中有的专业等,数据的完整性主要是防止数据库中出现不合语义的数据。为了维护数据库的完整性,DBMS需要实现以下功能:

1.提供定义完整性约束条件的机制
完整性约束条件又称完整性规则,是数据库中的数据必须满足的语意约束条件。表达了给定数据模型中数据以及其联系具有的约束和依存规则。比如主键和外键

2.提供完整性检查的方法
DBMS检查数据是否满足完整性约束条件的机制称为完整性检查,一般会在插入、更新和删除操作后开始执行检查。

3.进行违约处理
DBMS如果发现用户操作违背了完整性约束将会采取一定动作,比如拒绝(NO ACTION)此操作或者级联(CASCADE)执行其他操作。

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

5.1 实体完整性

关系模型的实体完整性在CREATE TABLE中使用PRIMARY KEY定义。实体完整性指的是是否能够唯一的区分出一个实体,因此PRIMARY KEY是用于唯一标识一个实体的符号,如同人的身份证一般。PRIMARY KEY可以只使用一个属性作为主键,也可以将多个属性设置为主键。

使用了PRIMARY KEY定义主码之后,对基本表进行更新或者插入操作的时候,就会执行实体完整性规则检查,包括:

  • 检查主码值是否唯一,不唯一则拒绝操作
  • 检查主码的各个属性是否为空,只要有某一行的属性为空就拒绝修改

检查主码是否为空的唯一方法就是进行全表扫描,判断是否有重复的主码。但是遍历的性能很低,因此DBMS会在主码上自动建立一个索引,比如B+树索引,通过索引查找基本表中是否存在新的主码值,这样会大大提高效率,具体B+树内容请参考数据结构专栏——第八章 查找

5.2 参照实体性

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

在这里插入图片描述

参照完整性将两个表中的相应元组联系起来了,因此对被参照表和参照表进行CRUD时可能会破坏参照完整性,必须进行检查以保证这两个表数据的一致性。比如:
在这里插入图片描述

当发生不一致的情况,一般有以下三种处理策略:

  • 拒绝(NO ACTION)执行:不允许该语句执行,这是默认策略
  • 级联(CASCADE):假设删除或者修改被参照表的一个元组导致参照表不一致时,删除或者修改参照表中所有导致不一致的元组。比如删除了学生表中的一个学生,则顺带在选课表表中删除该学生的所有选课信息。
  • 设为空值:可以将被参考表不一致的数据暂时置为空值,比如删除了班级表中的一个班级,然后在学生表中将该班级的所有学生的班级信息都变为空值,等待重新分班。该策略要注意:参照表中的的列需要设置为允许空值。

5.3 用户定义的完整性

用户定义的完整性就是针对某一具体应用的数据必须满足的语义要求。目前DBMS都提供了定义和检验这类完整性的机制。

1.属性上的约束条件

在CREATE TABLE定义属性的同时,可以根据应用要求定义属性上的约束条件,也就是属性值限制,包括:

  • 列值非空(NOT NULL)
  • 列值唯一(UNIQUE)
  • 检查列值是否满足一个条件表达式(CHECK短语)

使用例子如下:

CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY,
Ssex CHAR(2) CHECK (Ssex IN(‘m’,‘f’))) // 性别只能是男或者女

如果不满足属性约束条件,会被直接拒绝执行

2.元组上的约束条件

元组上的约束条件定义和属性约束条件定义类型,在CREATE TABLE语句中可以使用CHECK短语定义元组上的约束条件。元组级的约束条件可以设置不同属性取值的相互约束条件。

// 学生性别为男的时候,名字不能以Ms.打头
CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY,
Sname CHAR(8) NOT NULL,
Ssex CHAR(2),
CHECK (Ssex=‘f’ OR Sname NOT LIKE ‘Ms.%’));

如果不满足元组约束条件规则,会被直接拒绝执行

5.4 完整性约束命名子句

SQL在CREATE TABLE语句中提供了完整性约束命名子句CONSTRAINT,用来对完整性约束条件命名,从而可以更灵活的增加、删除一个完整性约束条件,格式如下:

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

其中的完整性约束条件包括NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY,CHECK短语等等。通过给约束命名,我们可以很方便的修改完整性,比如:

ALTER TABLE Student DROP CONSTRAINT C4;	//去除Student表中的C4约束

ALTER TABLE Student ADD CONSTRAINT C1 CHECK (Sno BETWEEN 9000 AND 9999);	// 新增C1约束

5.5 域中的完整性限制

5.6 断言

在SQL中可以使用CREATE ASSERTION语句,通过声明性断言来指定更具一般性的约束。可以定义涉及多个表或者聚集操作的比较复杂的完整性约束。断言创建后,任何对断言中所涉及到的关系的操作都会触发关系数据库对断言的检查,任何使断言不为真的操作都会被拒绝执行。

一般使用如下语句创建断言:

CREATE ASSERTION <断言名><CHECK子句>

每个断言都会被赋予一个名字,CHECK子句中的约束条件和WHERE子句的条件表达式类似。

// 限制数据库课程最多60名学生选修
CREATE ASSERTION ASSE_SC_DB_SUM
CHECK (60>=(SELECT count(*) FROM Course,SC
WHERE SC.Cno=Course.Cno AND Course.Cname=‘数据库’)

每当往SC表中插入一条元组,该断言就会被触发。一旦人数超过60人,CHECK子句就会返回false值

删除断言只需要使用DROP ASSERTION <断言名>

5.7 触发器(Trigger)

触发器是用户定义在关系表上的一类由事件驱动的特殊过程。用户的对应操作会触发触发器,而触发器则会执行相应的操作。

一、定义触发器

触发器又叫做事件——条件——动作规则。当特定的系统事件发生的时候,则会对规则的条件进行检查。创建触发器的指令如下:

CREATE TRIGGER <触发器名>
{BEFORE|AFTER} <触发事件> ON <表名>
REFERENCEING NEW|OLD ROW AS <变量>
FOR EACH{ROW|STATEMENT}
[WHEN <触发条件>] <触发动作体>

  • 只有表的拥有者,才可以在表上创建触发器,并且一个表上只能创建一定数量的触发器

  • 触发器名可以包含模式名。同一模式下,触发器名必须是唯一的,并且触发器名和表名需要在同一模式下。

  • 触发器只能定义在基本表上,不能定义在视图上。

  • 触发事件可以是INSTER\DELETE\UPDATE和这几个事件的组合。AFTER、BEFORE指明了触发的时机,是执行前还是执行后触发。

  • 触发器类型可以被分为行级触发器(FOR EACH ROW)和语句级触发器(FOR EACH STATEMENT)。假设表Teacher有1000行,执行UPDATE Teacher SET Deptno=5,如果是语句级触发器,则执行完语句后执行一次;如果是行级触发器,则会执行1000次触发体

  • 触发条件:触发器被激活是,只有触发条件为真触发动作体才会开始执行

  • 触发动作体:

触发动作体指的是触发触发器后执行的动作。触发动作体可以是一个匿名的PL/SQL过程块,也可以是对已经创建存储过程的调用。如果触发动作体执行失败,则激活触发器的事件会终止执行。

二、激活触发器

三、删除触发器

使用

DROP TRIGGER <触发器名> ON <表名>

删除触发器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/178637.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

好客租房-13.WebMagic

13. 项目接入ES编写爬虫抓取房源数据开发搜索房源接口服务整合前端开发实现搜索功能优化搜索功能增加高亮和分页功能热词推荐功能实现拼音分词13.1 制作假数据13.1.1 WebMagic抓取数据为了丰富我们的房源数据&#xff0c;所以我们采用WebMagic来抓取一些数据&#xff0c;目标网…

还在纠结选择用什么浏览器?手机端用国产浏览器也很香

一说到受欢迎的电脑浏览器&#xff0c;大家肯定不约而同地说谷歌浏览器。微软edge浏览器能够同步书签、插件也非常多&#xff0c;因为这些优势深受国人的喜爱。有人纠结在国内选择谷歌好&#xff0c;还是edge浏览器好呢&#xff1f;可能有的人哪个也不选&#xff0c;反而在电脑…

Docker 解决 `denied: requested access to the resource is denied`

背景 由于不可描述的原因&#xff0c;相对于以前&#xff0c;最近在更加频繁的迁移服务器&#xff0c;简单的 Shell 脚本已经不能满足需求了&#xff0c;于是将所有的项目 Docker 化。 部分不含敏感配置的项目准备放到 DockerHub 上面&#xff0c;但是在 docker push 的时候报…

利用 Algolia 为静态博客搭建实现内容搜索

现在静态博客的标配之一就是博客搜索&#x1f50d;&#xff0c;我也是通过搭建博客发现了它&#xff0c;这篇主要记录一下怎么使用 algolia 完成博客搜索&#xff0c;自己的博客搭建使用的是 docusaurus 。 注册账号 首先需要去 algolia 官网注册自己的账号&#xff0c;可以直…

Java线程池(超详细)

1、基本概念 Java线程需要经过线程的创建&#xff0c;调用和销毁整个过程&#xff0c;频繁的创建和销毁会大大影响性能&#xff0c;所以引入的线程池&#xff1a; 好处&#xff1a; 提升性能&#xff1a;线程池能独立负责线程的创建、维护和分配线程管理&#xff1a;每个Java…

k8s安装kuboard面板

前面介绍了k8s的dashboard面板&#xff0c;这里介绍国人开发的kuboard面板&#xff0c;相较于dashboard面板&#xff0c;kuboard面板对很多运维调试功能做了很多增强。官方文档&#xff1a;https://www.kuboard.cn/install/v3/install.html#kuboard-v3-x-%E7%89%88%E6%9C%AC%E8…

实现一个TCP客户端——服务端协议

目录 TCP客户端常见的API&#xff1a; ServerSocket: Socket&#xff1a; TCP服务端(单线程版本) 属性构造方法: 启动服务端的start()方法 步骤一&#xff1a;接收客户端发送的socket 步骤二&#xff1a; 调用processConnection方法来处理客户端发送的连接 ①通过参数传入的…

影像组学|特征定义以及提取

一、 影像组学特征分类 1.1 影像组学特征分类 1.1.1 一阶统计特征 一阶统计特征&#xff0c;反应所测体素的对称性、均匀性以及局部强度分布变化。包括中值&#xff0c;平均值&#xff0c;最小值&#xff0c;最大值&#xff0c;标准差&#xff0c;偏度&#xff0c;峰度等。 …

【Linux】六、Linux 基础IO(三)|文件系统|软硬链接|文件的三个时间

目录 八、文件系统 8.1 磁盘 8.1.1 磁盘的物理结构 8.1.2 磁盘的存储结构 8.1.3 磁盘的逻辑结构 8.2 inode 九、软硬链接 9.1 软链接 9.2 硬链接 9.3 当前路径(.)和上级路径(..) 十、文件的三个时间 八、文件系统 上面的内容谈论的都是一个被打开文件&#xff0c;那…

如何将两个录音合成一个?这篇文章告诉你

现如今&#xff0c;很多小伙伴都加入到短视频行业当中。而短视频的制作往往需要将多段音频进行一个合并。那么问题来了&#xff0c;当你想多个音频进行合并在一起的时候&#xff0c;你是怎么做的呢&#xff1f;其实很简单&#xff0c;我们只需要借助市面上的一些合并软件就好了…

初始网络

文章目录初始网络局域网 / 广域网IP地址 和 端口号认识协议协议分层初始网络 这里可以先自行在网上了解一下网络的发展史 也就是互联网是怎么来的. 局域网 / 广域网 关于网络的发展史 , 会涉及到两个非常重要的术语 &#xff0c;也就是 局域网&#xff0c;和广域网 。 局域网 &…

JavaEE多线程-阻塞队列

目录一、认识阻塞队列1.1 什么是阻塞队列&#xff1f;1.2 生产者消费者模型1.3 标准库中的阻塞队列类二、循环队列实现简单阻塞队列2.1 实现循环队列2.2 阻塞队列实现一、认识阻塞队列 1.1 什么是阻塞队列&#xff1f; 阻塞队列&#xff1a;从名字可以看出&#xff0c;他也是…

简明Java讲义 2:数据类型和运算符

目录 1、安装IDE编辑器 2、关键字和保留字 3、标识符 4、分隔符 5、数据类型 6、基本类型的数据类型转换 7、表达式类型的自动提升 8、变量 9、运算符 10、运算符的优先级 1、安装IDE编辑器 在开始内容之前&#xff0c;先下载IDE&#xff0c;可以是Eclipse或STS&…

Python函数(函数定义、函数调用)用法详解

Python 中函数的应用非常广泛&#xff0c;前面章节中我们已经接触过多个函数&#xff0c;比如 input() 、print()、range()、len() 函数等等&#xff0c;这些都是 Python 的内置函数&#xff0c;可以直接使用。除了可以直接使用的内置函数外&#xff0c;Python 还支持自定义函数…

LeetCode刷题模版:201 - 210

目录 简介201. 数字范围按位与202. 快乐数203. 移除链表元素204. 计数质数205. 同构字符串206. 反转链表207. 课程表【未实现】208. 实现 Trie (前缀树)209. 长度最小的子数组210. 课程表 II【未实现】结语简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您…

LeetCode[1319]连通网络的操作次数

难度&#xff1a;中等题目&#xff1a;用以太网线缆将 n台计算机连接成一个网络&#xff0c;计算机的编号从 0到 n-1。线缆用 connections表示&#xff0c;其中 connections[i] [a, b]连接了计算机 a和 b。网络中的任何一台计算机都可以通过网络直接或者间接访问同一个网络中其…

(十六)异步编程

CompletableFuture在Java8中推出&#xff0c;Java8中的异步编程就是依靠此类。几种任务接口四种任务无参数有一个参数有两个参数无返回值RunnableConsumerBiConsumer有返回值SupplierFunctionBiFunctionCompletionStage接口这个类中定义的许多能够链式调用的方法和组合方法时是…

Unity3DVR开发—— XRInteractionToolkit(PicoNeo3)

目录 一、开发前的准备 二、基础配置 三、Pico项目配置 四、添加基础功能 一、开发前的准备 1、为了方便开发&#xff0c;先在Pico开发者平台里下载预览工具 Pico开发者平台https://developer-global.pico-interactive.com/sdk?deviceId1&platformId1&itemId17 2、…

【哈希表】关于哈希表,你该了解这些!

【哈希表】理论基础1 哈希表2 哈希函数3 哈希碰撞3.1 拉链法3.2 线性探测法4 常见的三种哈希结构5 总结1 哈希表 哈希表 Hash table &#xff08;一些书籍翻译为散列表&#xff09; 哈希表是根据关键码的值而直接进行访问的数据结构。 直白来讲其实数组就是一张哈希表。 哈希表…

用1行Python代码识别增值税发票,YYDS

大家好&#xff0c;这里是程序员晚枫。 录入发票是一件繁琐的工作&#xff0c;如果可以自动识别并且录入系统&#xff0c;那可真是太好了。 今天我们就来学习一下&#xff0c;如何自动识别增值税发票并且录入系统~ 识别发票 识别发票的代码最简单&#xff0c;只需要1行代码…