数据库系统概论:数据库完整性

news2024/9/21 2:49:47

引言

数据库是现代信息系统的心脏,数据的准确性和一致性对于业务流程至关重要。数据库完整性是确保数据质量的基石,它涵盖了数据的正确性、相容性和一致性,是数据安全与业务连续性的保障。

数据库完整性是指数据的精确性、可靠性和逻辑一致性,它防止数据库中出现不符合语义的数据。其目的是保护数据免受意外或恶意破坏,确保数据在逻辑上的一致性、正确性和有效性

数据库完整性

基本概念

数据库的完整性(integrity)是指数据的正确性(correctness)和相容性(compat-ability):

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

数据库的完整性是为了防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据。因此,完整性检查和控制的防范对象是不合语义的、不正确的数据,防止它们进入数据库。

而数据库的安全性是保护数据库防止恶意破坏和非法存取。因此,安全性控制的防范对象是非法用户和非法操作,防止他们对数据库数据的非法存取。

为维护完整性 DBMS 必须要实现如下功能:

  1. 提供定义完整性约束条件的机制
  • 完整性约束条件:是数据库中数据必须满足的语义条件规则
  • SQL 标准使用了一系列概念来描述完整性,包括关系模型的实体完整性、参照完整性和用户定义完整性
  1. 提供完整性检查的方法:检查数据是否满足完整性约束条件的机制。一般在 INSERTUPDATEDELETE 语句执行后开始检查,也可以在事务提交时检查。检查这些操作执行后数据库中的数据是否违背了完整性约束条件。

  2. 进行违约处理:数据库管理系统若发现用户的操作违背了完整性约束条件将采取一定的动作,如拒绝实体完整性(NOACTION)执行该操作或级联(CASCADE)执行其他操作,进行违约处理以保证数据的完整性。

实体完整性

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

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

    1. 定义为列级约束条件,即直接在列定义中使用 PRIMARY KEY 关键字。
CREATE TABLE table_name(
	Sno CHAR(10) PRIMARY KEY,
	-- ...
)
  1. 定义为表级约束条件,即在列定义之后,使用 PRIMARY KEY 关键字并括上需要作为主键的列名。
CREATE TABLE table_name(
	Sno CHAR(10),
	-- ...
	PRIMARY KEY(Sno)
)
  • 对多个属性构成的码只有一种说明方法,即定义为表级约束条件
CREATE TABLE table_name(
	Sno CHAR(10),
	Cno CHAR (10),
	-- ...
	PRIMARY KEY(Sno,Cno)
)
实体完整性检查和违约处理

PRIMARY KEY 短语定义了关系的主码后,每当用户程序对基本表插入一条记录或对主码列进行更新操作时,关系数据库管理系统将按照关系数据库的实体完整性规则自动进行检查:

  1. 检查主码值是否唯一,如果不唯一则拒绝插入或修改。

  2. 检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改。

检查记录中主码值是否唯一的一种方法是进行全表扫描,依次判断表中每一条记录的主码值与将插入记录的主码值(或者修改的新主码值)是否相同。

全表扫描是十分耗时的。为了避免对基本表进行全表扫描,关系数据库管理系统一般都在主码上自动建立一个索引,如B+树索引,通过索引查找基本表中是否已经存在新的主码值将大大提高效率。

参照完整性

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

CREATE TABLE SC(
	Sno CHAR(9)NOT NULL,
	Cno CHAR(10) NOT NULL,
	-- ...
	-- 表级定义实体完整性
	PRIMARY KEY(Sno,Cno),
	-- 表级定义参照完整性
	FOREIGN KEY(Sno) REFERENCES Student(Sno),
	FOREIGN KEY(Cno) REFERENCES Course(Cno)
)
参照完整性检查

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

可能破坏参照完整性的情况:

![[References Complexity.png]]

  1. SC 表中增加一个元组,该元组的 Sno 属性值在表 Student 中找不到一个 Sno 属性值与之相等的元组。

  2. 修改 SC 表中的一个元组,修改后该元组的 Sno 属性值在表 Student 中找不到一个元组,其 Sno 属性值与之相等。

  3. Student 表中删除一个元组,造成 SC 表中某些元组的 Sno 属性值在表 Student 中找不到一个元组,其 Sno 属性值与之相等。

  4. 修改 Student 表中一个元组的 Sno 属性,造成 SC 表中某些元组的 Sno 属性值在表 Student 中找不到一个元组,其 Sno 属性值与之相等

违约处理

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

  1. 拒绝 NOACTION 执行:不允许该操作执行。该策略一般设置为默认策略。

  2. 级联 CASCADE 操作:当删除或修改被参照表的一个元组导致与参照表的不一致时,删除或修改参照表中的所有导致不一致的元组。

  3. 设置为空值 NULL:当删除或修改被参照表的一个元组时造成了不一致,则将参照表中的所有造成不一致的元组的对应属性设置为空值。(设置为主码的外码不能设置为空值,违反实体完整性)

当对参照表和被参照表的操作违反了参照完整性时,系统选用默认策略,即拒绝执行

如果想让系统采用其他策略则必须在创建参照表时显式地加以说明:

CREATE TABLE SC
(
	Sno CHAR(9)
	Sno CHAR(4) 
	PRIMARY KEY(Sno,Cno),
	
	FOREIGN KEY(Sno) REFERENCES Student(Sno)
	-- 删除 Student 表的元组时,级联删除本表相应元组
		ON DELETE CASCADE
	-- 更新 Student 表中的 Sno 时,级联更新本表相应元组
		ON UPDATE CASCADE, 
	
	FOREIGN KEY(Cno) REFERENCES Course(Cno)
	-- 删除 Course 表的元组造成不一致时,拒绝执行
		ON DELETE NO ACTION
	-- 更新 Course 表中的 Cno 时,级联更新本表相应元组
		ON UPDATE CASCADE
);

用户自定义的完整性

用户自定义完整性针对某一具体应用所涉及的数据必须满足的语义要求,目前的关系数据库管理系统都提供了定义和检验这类完整性的机制,使用了和实体完整性、参照完整性相同的技术和方法来处理它们,而不必由应用程序承担这一功能。

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

    • NOTNULL:列值非空
    • UNIQUE:列值唯一
    • CHECK(condition) 短语:检查列值是否满足一个条件表达式
CREATE TABLE table_name(
	Sno CHAR(10) NOT NULL PRIMARY KEY;
	Cno CHAR(10) UNIQUE NOT NULL,
	Grade INT CHECK(Grade>=0 AND Grade<=100)
	-- ...
)
  • 属性上约束条件的检查和违约处理:当往表中插入元组或修改属性的值时,关系数据库管理系统将检查属性上的约束条件是否被满足,如果不满足则操作被拒绝执行
  1. 元组上的约束条件:与属性上约束条件的定义类似,在 CREATE TABLE 中可以用 CHECK短语 定义元组上的约束条件,即元组级的限制。同属性值限制相比,元组级的限制可以设置不同属性之间的取值的相互约束条件。
CREATE TABLE table_name(
	Gender CHAR(4),
	Sname VARCHAR(10),
	-- ...
	CHECK(Gender='男' OR Sname NOT LIKE 'Ms.%')
)
  • 当向表中插入元组或修改属性的值时,关系数据库管理系统将检查元组上的约束条件是否被满足,如果不满足则操作被拒绝执行

完整性约束条件子句

SQL 还在 CREATE TABLE 语句中提供了完整性约束命名子句CONSTRAINT,用来对完整性约束条件命名从而可以灵活地增加、删除一个完整性约束条件。

  • 列级约束:直接在列定义中使用 PRIMARY KEY 关键字。

  • 表级约束:在列定义之后,使用 PRIMARY KEY 关键字并括上需要作为主键的列名。

创建 CONSTRAINT 子句
CONSTRAINT 'constraint_name' constraint_condition
  • constraint_name:完整性约束条件名

  • constraint_condition:完整性约束条件(UNIQUECHECK等)

    • UNIQUE 约束:保证列或列组合的值是唯一的,但允许NULL值的存在。
    • CHECK 约束:定义列值必须满足的条件,可以是算术或逻辑表达式。
CREATE TABLE table_name(
	Sno CHAR(10)
		CONSTRAINT con1 NOT NULL, PRIMARY KEY,
	Sage INT
		CONSTRAINT con2 CHECK(Sage<=18 AND Sage>=0)
)
修改表中的完整性约束条件

借助 ALTER TABLE 语句可以动态地添加或删除表中的完整性限制

删除限制:

ALTER TABLE table_name
DROP CONSTRAINT con1

添加限制:

ALTER TABLE table_name
ADD CONSTRAINT con3 UNIQUE(Sage)

若需要修改限制,则可以删除指定限制后重新添加限制。

注意事项
  • 在使用复合主键(由多个列组成)时,确保所有组合的值在所有行中都是唯一的。

  • 当使用 CHECK 约束时,确保条件逻辑的正确性,避免无效或过于复杂的约束条件。

  • 在修改约束之前,考虑其对现有数据的影响,确保不会违反新约束。

断言 ASSERTION

在 SQL 中可以使用数据定义语言中的 CREATE ASSERTION 语句,通过声明性断言(declarative assertions)来指定更具一般性的约束(如涉及多表、聚集操作等)。可以定义涉及多个表或聚集操作的比较复杂的完整性约束。

断言创建以后,任何对断言中所涉及关系的操作都会触发关系数据库管理系统对断言的检查,任何使断言为 FALSE 的操作都会被拒绝执行。

MySQL 不支持 ASSERTION 关键字

创建断言

在SQL中,使用 CREATE ASSERTION 语句来创建断言

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

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

删除断言
DROP ASSERTION<断言名>

如果断言很复杂,则系统在检测和维护断言上的开销较高,这是在使用断言时应该注意的。

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

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

相关文章

Gitee使用教程2-克隆仓库(下载项目)并推送更新项目

一、下载 Gitee 仓库 1、点击克隆-复制代码 2、打开Git Bash 并输入复制的代码 下载好后&#xff0c;找不到文件在哪的可以输入 pwd 找到仓库路径 二、推送更新 Gitee 项目 1、打开 Git Bash 用 cd 命令进入你的仓库&#xff08;我的仓库名为book&#xff09; 2、添加文件到 …

【Unity】升级至API34,编译报错Java Runtime版本问题

文章目录 一、背景二、问题描述三、原因和解决方法 一、背景 1、Unity 2021.3.33f1 2、Firebase 11.7.0 3、Max Unity 6.5.2 3、升级至API-34 二、问题描述 错误信息 Could not load custom lint check jar file C:\Users\xxx.gradle\caches\transforms-2\files-2.1\b27e2aac8…

pnpm build打包时占内溢出

这两天在打包H5网页的时候&#xff0c;失败&#xff0c;总是提示下方错误&#xff0c;试了多种方法下方的亲测有效 FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory 严重错误&#xff1a;堆限制附近标记压缩无效分…

【字幕】字幕特效入门

前言 最近两周调研了一下字幕特效的底层程序逻辑&#xff0c;因为工作内容的原因&#xff0c;就分享几个自己找的链接具体细节就不分享了&#xff0c;CSDN也是我的个人笔记&#xff0c;只记录一些简单的内容用于后续自己方便查询&#xff0c;顺便帮助一下正在苦苦查阅资料入门…

.net core appsettings.json 配置 http 无法访问

1、在appsettings.json中配置"urls": "http://0.0.0.0:8188" 2、但是网页无法打开 3、解决办法&#xff0c;在Program.cs增加下列语句 app.UseAntiforgery();

数据库系统概论:数据库系统模式

数据库系统在我们的数字世界中扮演着至关重要的角色&#xff0c;无论是个人设备还是企业级应用&#xff0c;数据的有效管理和访问都是必不可少的。而数据库系统的模式结构是确保数据一致性和可访问性的关键组成部分。 数据库系统模式 基本概念 型和值 数据模型中有 型(type…

数据结构之细说链表

1.1顺序表的问题以及思考 经过上一篇顺序表的学习&#xff0c;我们知道顺序表还是有很多缺点 顺序表的缺点&#xff1a; 1.中间/头部的插入删除&#xff0c;实际复杂度为O(N) 2.增容需要申请新空间&#xff0c;拷贝数据&#xff0c;释放旧空间。会有不小的消耗 3.扩容一般…

【ECharts】使用 ECharts 处理不同时间节点的数据系列展示

使用 ECharts 处理不同时间节点的数据系列展示 在数据可视化中&#xff0c;我们经常遇到这样的问题&#xff1a;不同数据系列的数据点在时间轴上并不对齐。这种情况下&#xff0c;如果直接在 ECharts 中展示&#xff0c;图表可能会出现混乱或不准确。本文将通过一个示例代码&a…

vue3+vite从零架构:写组件、构建、打包并上传个人前端组件库至私有npm仓库最终在自己项目中下载并使用(超详细的流程,小编已实现)

目录 第一章 前言 第二章 准备工作 第三章 封装组件 3.1 文件结构 3.2 编写组件代码 第四章 项目打包 第五章 发布到npm 5.1 npm准备工作 5.2 发布npm包 ​编辑 第六章 从npm安装使用 第一章 前言 在我们很多开发过程中&#xff0c;不管是使用vue还是react&#x…

【Docker】Docker-harbor私有仓库部署与管理

目录 一.Harbor 概述 1.什么是Harbor 2.Harbor的特性 3.Harbor的构成 二.Harbor 部署 1.部署 Docker-Compose 服务 2.部署 Harbor 服务 3.启动 Harbor 4.创建新项目 5.创建用户 6.本地上传镜像 7.从Harbor下载镜像 三.镜像同步 1.定时拉取 2.主动推送 四.管理 …

掌握这些技巧,让你成为画册制作高手

在数字化的时代背景下&#xff0c;电子画册以其便捷的传播方式、丰富的视觉表现形式&#xff0c;赢得了大众的喜爱。它不仅能够在个人电脑上展现&#xff0c;还能通过智能手机、平板电脑等多种移动设备随时随地被访问和浏览。这种跨平台的支持&#xff0c;使得无论你身处何地&a…

基于STM32智能电子锁设计

1.简介 随着时代的高速发展&#xff0c;家居安全也成为人们日常生活中的一个安全问题。目前传统的门锁使用的是机械密码&#xff0c;在安全性方面表现不佳。这些缺点可以通过改用智能电子密码锁来弥补。智能电子锁是一种使用了现代电子技术的高科技产品&#xff0c;它的出现解决…

【iOS】类对象的结构分析

目录 对象的分类object_getClass和class方法isa流程和继承链分析isa流程实例验证类的继承链实例验证 类的结构cache_t结构bits分析实例验证属性properties方法methods协议protocolsro类方法 类结构流程图解 对象的分类 OC中的对象主要可以分为3种&#xff1a;实例对象&#xf…

江协科技51单片机学习- p27 I2C AT24C02存储器

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

动手学深度学习——5.卷积神经网络

1.卷积神经网络特征 现在&#xff0c;我们将上述想法总结一下&#xff0c;从而帮助我们设计适合于计算机视觉的神经网络架构。 平移不变性&#xff08;translation invariance&#xff09;&#xff1a;不管检测对象出现在图像中的哪个位置&#xff0c;神经网络的前面几层应该对…

C++从入门到起飞之——类的定义/实例化 全方位剖析!

个人主页&#xff1a;秋风起&#xff0c;再归来~ C从入门到起飞 个人格言&#xff1a;悟已往之不谏&#xff0c;知来者犹可追 克心守己&#xff0c;律己则安&#xff01; 目录 1.类的定义 1.1、类定义格式 1.2、访问限定符 1.3、类域 2.实例化 2.…

基于Vue CLI 3构建Vue3项目(Vue2也可参考)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

基于嵌入式Linux的高性能车载娱乐系统设计与实现 —— 融合Qt、FFmpeg和CAN总线技术

随着汽车智能化的发展&#xff0c;车载娱乐系统已成为现代汽车的标配。本文介绍了一个基于Linux的车载娱乐系统的设计与实现过程。该系统集成了音视频娱乐、导航、车辆信息显示等功能&#xff0c;旨在提供安全、便捷、丰富的驾驶体验。 1. 项目概述 随着汽车智能化的发展&…

基于Java的在线考试系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;Java MySQL B/S架构 SpringBoot框架 工具&#xff1a;Eclipse、MySQL环境配置工具 系统展示 首…

备忘录删除了怎么恢复 备忘录误删恢复办法

备忘录作为我们日常生活中的得力助手&#xff0c;帮助我们记录重要事项和灵感&#xff0c;然而&#xff0c;使用中偶尔会出现误删的情况。若不能及时找回误删的内容&#xff0c;可能会造成重要信息的丢失&#xff0c;给我们的工作和生活带来不必要的麻烦。 如果你也担心备忘录…