数据库系统概论|第五章:数据库完整性—课程笔记1

前言

在前文介绍完数据库标准语言SQL之后,大家已经基本上掌握了关于数据库编程的基本操作,那我们今天将顺承介绍关于数据库完整性的介绍,数据库的完整性是指数据的正确性****和相容性 。数据的完整性是为了防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据

一、数据库完整性概述

数据库的完整程度极大程度上地决定了在数据库中所导入数据的正确性与否,对于数据库完整性的正确操作与设置,可以确保所输入数据的有效性与可利用性。

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

  • 提供定义完整性约束条件的机制;
  • 提供完整性检查的方法
  • 进行违约处理

其实简单理解就是应该具备三个功能:定义完整性→检查完整性→控制完整性,所以在进行编程的过程中,也应该注意SQL语言的编译。

依据对象的级别,完整性约束可以分为:

  • **列级约束:**针对列的类型、取值范围、精度、排序规则等制定的约束条件。
  • **元组级约束:**元组中的字段组和字段间联系的约束。
  • **表级约束:**若干元组间、关系中以及关系之间联系的约束。

二、实体完整性

2.1定义实体完整性

关系模型的实体完整性在CREATE TABLE中用PRIMARY KEY 定义。对单属性构成的码有两种说明方法,一种是定义为列级约束条件 ,另一种是定义为表级约束条件。对多个属性构成的码只有一种说明方法,即定义为表级约束条件

R 复制代码
CREATE TABLE Student (
	Sno CHAR(9) PRIMARY KEY,
	Sname CHAR(20) NOT NULL, 
	Ssex CHAR(2),
	Sage SMALLINT,
	Sdept CHAR(20)
)

上述代码利用列级约束条件 ,直接在建表过程中,在相应的属性列后面直接标明PRIMARY KEY ,即代表所在列为该表的主码,如上述代码,即代表:++将Student表中的Sno属性定义为主码++。

R 复制代码
CREATE TABLE SC(
	Sno CHAR(9) NOT NULL, 
	Cno CHAR(4) NOT NULL, 
	Grade SMALLINT,
	PRIMARY KEY (Sno,Cno)
) 

上述代码中因为主码的构成由多个属性列共同决定,因此只能采用表级约束条件 ,便是在最后,利用PRIMARY KEY()表明主码的构成 ,如上述代码,即代表:++将SCt表中的Sno、Cno属性共同定义为主码++。

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

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

实体完整性规则

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

三、参照完整性

3.1参照完整性定义

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

R 复制代码
CREATE TABLE SC(
	Sno CHAR(9) NOT NULL, 
	Cno CHAR(4) NOT NULL, 
	Grade SMALLINT,
	/*在表级定义实体完整性*/
    PRIMARY KEY (Sno, Cno), 
	/*在表级定义参照完整性*/
    FOREIGN KEY (Sno) REFERENCES Student (Sno), 
	FOREIGN KEY (Cno) REFERENCES Course (Cno)
)

上述代码中运用表级约束条件分别设置实体完整性与参照完整性,代码较为简单。

3.2参照完整性检查及违约处理

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

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

1. 拒绝执行

  • ------不允许该操作执行。这是默认的策略。

2. 级联操作

  • ------级联修改:当修改主码时,同时修改对应的外码的值。
  • ------级联删除:当删除被参照表中的某条记录时,同时删除参照表中、引用了被参照表中待删除元组主码值的所有记录。

3. 设置为空值

  • ------当删除或修改被参照表的某个元组时造成了不一致,则将参照表中的所有造成不一致的元组的对应属性设为空值。

四、用户定义的完整性

4.1属性上的约束条件的定义

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

  • 列值非空 (NOT NULL短语)。
  • 列值唯一 (UNIQUE短语)。
  • ③检查列值是否满足一个布尔表达式(CHECK短语)。
R 复制代码
CREATE TABLE Student(
	Sno CHAR(9) PRIMARY KEY,
	Sname CHAR(8) NOT NULL, 
	Ssex CHAR(2) CHECK (Ssex IN ('男','女')), 
	Sage SMALLINT,
	Sdept CHAR(20) UNIQUE
)

上述代码展示了如何进行属性上的约束条件的定义,使用列级约束条件进行限制与编写代码,上述代码要求++对于Sname需要非空,检查Ssex列必须在"男","女"之间进行取值,要求Sdept列必须唯一++。

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

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

4.3元组上的约束条件的定义

在CREATE TABLE语句中可以用CHECK 短语定义元组上的约束条件,即元组级的限制。同属性值限制相比,元组级的限制可以设置不同属性之间的取值的相互约束条件。

R 复制代码
CREATE TABLE Student(
	Sno CHAR(9), 
	Sname CHAR(8) NOT NULL,
	Ssex CHAR(2),
	Sage SMALLINT,
	Sdept CHAR(20),
	PRIMARY KEY (Sno),
	CHECK (Ssex='女' OR Sname NOT LIKE 'Ms.%')
	/*定义了元组中Sname和 Ssex两个属性值之间的约束条件*/
)

上述代码应用表级约束条件编写代码,功能为:++当学生的性别是男时,其名字不能以Ms.打头【表级约束条件对于全表进行限制,表中所插入的每一个元组都要进行此检查】++

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

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

五、完整性约束命名子句

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

5.1完整性约束命名子句

惯例

  • PRIMARY KEY:采用"PK__表名"的形式。例如PK__Student,代表该约束为Student的实体完整性约束
  • FOREIGN KEY:采用"FK__参照表名__被参照表名"的形式。
  • CHECK :采用"CK__表名__列名"的形式。
  • UNIQUE :采用"UN__表名__列名"的形式。

在编写过程中,常常进行如上编写,增强代码的可读性。

R 复制代码
CREATE TABLE Student(
	Sno NUMERIC(6)
	CONSTRAINT CK__Student__Sno CHECK (Sno BETWEEN 90000 AND 99999),
	Sname CHAR(20) NOT NULL,
	Sage NUMERIC(3)
	CONSTRAINT CK__Student__Sage CHECK (Sage < 30),
	Ssex CHAR(2)
	CONSTRAINT CK__Student__Ssex CHECK (Ssex IN ( '男','女')),
	CONSTRAINT PK__Student PRIMARY KEY(Sno)
)

上述代码很好的进行了关于约束条件的编写:共包含五个约束,分别为++要求学号在90000~99999之间,姓名不能取空值,年龄小于30,性别只能是"男"或"女",且要求学号为主码。++

5.2修改表中的完整性限制

使用ALTER TABLE语句可以修改表中的完整性限制,先删除原来的约束条件,再增加新的约束条件。关于完整性限制的删除,仍然使用DROP 语句,关于完整性限制的增加,仍然使用ADD语句。

R 复制代码
ALTER TABLE Student
	DROP CONSTRAINT CK__Student__Sage


ALTER TABLE Student
	ADD CONSTRAINT CK__Student__Sage CHECK (Sage < 40)

上述代码中,先删除了原有的完整性约束限制,同时增加了新的约束限制,具体含义为:++修改表Student中的约束条件,要年龄由小于30改为小于40。++

相关推荐
搏博23 分钟前
机器学习之五:基于解释的学习
人工智能·深度学习·学习·算法·机器学习
张槊哲2 小时前
字符和编码(python)
linux·数据库·python
云计算DevOps-韩老师3 小时前
跟韩学AiOps系列之2025学MySQL系列_如何在MySQL中开启和提交事务?!
数据库·mysql
herinspace5 小时前
管家婆易指开单如何设置零售开单
运维·服务器·数据库·软件工程·sass·零售
听闻风很好吃5 小时前
Redis应用场景实战:穿透/雪崩/击穿解决方案与分布式锁深度剖析
数据库·redis·分布式
编程在手天下我有6 小时前
从读写分离到分布式服务:系统架构演进十阶段深度解析
数据库·系统架构·微服务架构·分布式系统·互联网技术·技术架构优化
帅得不敢出门6 小时前
Android Framework学习二:Activity创建及View绘制流程
android·java·学习·framework·安卓·activity·window
计算机毕设定制辅导-无忧学长6 小时前
ActiveMQ 可靠性保障:消息确认与重发机制(二)
数据库·activemq·java-activemq
264玫瑰资源库6 小时前
红鸟3D互动系统源码一键部署教程(含多个打包版本与功能解构)
java·数据库·游戏
Charlotte's diary6 小时前
虚拟局域网(VLAN)实验(Cisco Packet Tracer)-路由器、交换机的基本配置
经验分享·学习·计算机网络