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

引言

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

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

数据库完整性

基本概念

数据库的完整性(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 INTCONSTRAINT 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://xiahunao.cn/news/3248314.html

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

相关文章

选择项目进度系统的10大必知软件

国内外主流的10款项目进度软件对比&#xff1a;PingCode、Worktile、蓝凌EIS智慧工作平台、Teambition、Tapd、Tower、Monday.com、ClickUp、Asana、Jira。 在选择项目进度系统时&#xff0c;你是否感到困惑或不确定如何挑选最适合自己团队的工具&#xff1f;市场上的众多选项和…

Uncaught (in promise) TypeError: Object(...) is not a function at eval

踩坑: Uncaught (in promise) TypeError: Object(...) is not a function at eval_at object.eval [as fullvalidate] (eval at <anonymo-CSDN博客 又新添一个错误的出现方式&#xff0c;后台启动没问题&#xff0c;但是我的数据库是无法自行启动的&#xff0c;这就导致在查…

Redis-布隆过滤器(Bloom Filter)详解

文章目录 什么是布隆过滤器 布隆过滤器的优点&#xff1a;布隆过滤器的缺点&#xff1a;其他问题 布隆过滤器适合的场景布隆过滤器原理 数据结构增加元素查询元素删除元素 如何使用布隆过滤器 Google开源的Guava自带布隆过滤器Redis实现布隆过滤器 Redis中配置布隆过滤器Redis…

MYSQL 四、mysql进阶 9(数据库的设计规范)

一、为什么需要数据库设计 二、范 式 2.1 范式简介 在关系型数据库中&#xff0c;关于数据表设计的基本原则、规则就称为范式。 可以理解为&#xff0c;一张数据表的设计结 构需要满足的某种设计标准的 级别 。要想设计一个结构合理的关系型数据库&#xff0c;必须满足一定的…

品牌出海“掘金”的王牌账号:亚马逊VC——WAYLI威利跨境助力商家

在全球化的大潮中&#xff0c;B2B模式已然成为品牌出海“掘金”的王牌账号&#xff0c;特别是在亚马逊VC这一强大平台的加持下。亚马逊VC不仅是企业间贸易的桥梁&#xff0c;更是品牌国际化的加速器。 亚马逊VC&#xff0c;为企业提供了直接进入亚马逊全球供应链的机遇。这不仅…

神经网络中如何优化模型和超参数调优(案例为tensor的预测)

总结&#xff1a; 初级&#xff1a;简单修改一下超参数&#xff0c;效果一般般但是够用&#xff0c;有时候甚至直接不够用 中级&#xff1a;optuna得出最好的超参数之后&#xff0c;再多一些epoch让train和testloss整体下降&#xff0c;然后结果就很不错。 高级&#xff1a;…

盛夏畅饮狂欢,肆拾玖坊肆玖嘿哈精酿白啤陪你嗨啤!

盛夏的炎热,犹如烈火燃烧,让人无法抵挡那股渴望畅饮的冲动。在这个时节,你是否也期待着与亲朋好友欢聚一堂,聚餐畅饮,共度清凉惬意的时光?快来!肆拾玖坊的肆玖嘿哈喊你一起嗨啤了! 提及啤酒,想必大家都不会陌生。这个古老的饮品,自公元前3世纪起便与人类相伴,穿越历史的长河,时…

【ProtoBuf】proto 3 语法 -- 详解

这个部分会对通讯录进行多次升级&#xff0c;使用 2.x 表示升级的版本&#xff0c;最终将会升级如下内容&#xff1a; 不再打印联系人的序列化结果&#xff0c;而是将通讯录序列化后并写入文件中。 从文件中将通讯录解析出来&#xff0c;并进行打印。 新增联系人属性&#xff…

常用指标和损失总结

损失 回归问题 L1损失 L1 损失是最小化模型参数的绝对值之和。 倾向于使模型参数接近零&#xff0c;导致模型变得更加稀疏。这意味着一些特征的权重可能变为零&#xff0c;从而被模型忽略。 对异常值非常敏感。异常值会导致参数权重绝对值增大&#xff0c;从而影响模型的整…

2024年【电工(高级)】考试报名及电工(高级)模拟考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 电工&#xff08;高级&#xff09;考试报名参考答案及电工&#xff08;高级&#xff09;考试试题解析是安全生产模拟考试一点通题库老师及电工&#xff08;高级&#xff09;操作证已考过的学员汇总&#xff0c;相对有…

【Charles】-雷电模拟器-抓HTTPS包

写在前面 之前的文章我们写过如何通过Charles来抓取IOS手机上的HTTPS包以及遇到的坑。说一个场景&#xff0c;如果你的手机是IOS&#xff0c;但是团队提供的APP安装包是Android&#xff0c;这种情况下你还想抓包&#xff0c;怎么办&#xff1f; 不要慌&#xff0c;我们可以安装…

Elasticsearch 批量更新

Elasticsearch 批量更新 准备条件查询数据批量更新 准备条件 以下查询操作都基于索引crm_flow_info来操作&#xff0c;索引已经建过了&#xff0c;本文主要讲Elasticsearch批量更新指定字段语句&#xff0c;下面开始写更新语句执行更新啦&#xff01; 查询数据 查询指定shif…

Java基础 —— 项目一:ATM存取款系统

目录 一、系统架构搭建 二、系统欢迎页设计 三、用户开户功能 卡号去重复 根据卡号查找账户 四、用户登录功能 展示用户登录后的操作页面 查询账户信息 存款 取款 转账 销户 修改密码 五、整体代码 1.账户类Account 2.银行系统类ATM 3.测试类Test 运行结果 他人之得&#xff0c…

什么是AGI?以及AGI最新技术如何?

首先&#xff0c;AGI是Artificial General Intelligence的缩写&#xff0c;意为人工通用智能。AGI指的是一种拥有与人类相当智能水平的人工智能系统&#xff0c;能够在各种不同的任务和环境中进行智能决策和问题解决。与目前大多数人工智能系统只能在特定领域下执行特定任务不同…

上线 Airflow 官方!DolphinDB 带来数据管理新体验

在数据驱动的商业时代&#xff0c;企业对数据的实时处理和分析能力提出了更高的要求。同时&#xff0c;自动化地管理及优化数据处理流程&#xff0c;以提升效率和精准度&#xff0c;始终是企业不断追求的目标。 近期&#xff0c; DolphinDB 正式登陆 Apache Airflow 官方&…

悠律Ringbud pro开放式耳机:双奖设计,开放式畅听的舒适体验

悠律Ringbud pro凝声环开放式耳机 凭借其潮酷的外观&#xff0c;轻奢的体验&#xff0c;斩获2024红点设计奖&#xff1a;德国红点奖设立于1955年&#xff0c;被公认为国际性创意和设计的认可标志&#xff1b;而且还获得美国MUSE设计金奖&#xff1a;美国MUSE设计奖是最具代表性…

语法错误检测工具哪个好用?5个工具一键扫除错别字

在撰写文章或编辑文档的过程中&#xff0c;你是否曾为了寻找并修正那些细微的语法错误而耗费大量时间&#xff1f; 想象一下&#xff0c;如果有一个便捷的工具&#xff0c;能够即时在线帮你捕捉并修正这些错误&#xff0c;是不是既高效又省心&#xff1f;这正是“语法错误检测…

【React】React18 Hooks 之memo、useCallback

目录 React.memo()案例1: 无依赖项&#xff0c;无props案例1: props比较机机制&#xff08;1&#xff09;传递基本类型&#xff0c;props变化时组件重新渲染&#xff08;2&#xff09;传递的是引用类型的prop&#xff0c;比较的是新值和旧值的引用&#xff08;3&#xff09;保证…

React的usestate设置了值后马上打印获取不到最新值

我们在使用usestate有时候设置了值后&#xff0c;我们想要更新一些值&#xff0c;这时候&#xff0c;我们要想要马上获取这个值去做一些处理&#xff0c;发现获取不到&#xff0c;这是为什么呢&#xff1f; 效果如下&#xff1a; 1、原因如下 在React中,当你使用useState钩子…

【STM32 HAL库】I2S的使用

使用CubeIDE实现I2S发数据 1、配置I2S 我们的有效数据是32位的&#xff0c;使用飞利浦格式。 2、配置DMA **这里需要注意&#xff1a;**i2s的DR寄存器是16位的&#xff0c;如果需要发送32位的数据&#xff0c;是需要写两次DR寄存器的&#xff0c;所以DMA的外设数据宽度设置16…