『数据库』这篇数据库的文章真没人看-数据库完整性

『数据库』这篇数据库的文章真没人看-数据库完整性

『数据库』 朴实无华且枯燥的数据库教程–入门必看!(不收藏,真的吃亏了)
@[toc]
什么是数据库的完整性
➢ 数据的正确性和相容性
➢ 防止不合语义的数据进入数据库。
➢ 完整性:真实地反映现实世界

数据的完整性和安全性是两个不同概念

  1. 数据的完整性
    ➢ 防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据
    ➢ 防范对象:不合语义的、不正确的数据
  2. 数据的安全性
    ➢ 保护数据库防止恶意的破坏和非法的存取
    ➢ 防范对象:非法用户和非法操作

为维护数据库的完整性,DBMS 必须:

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

完整性约束条件定义

  1. 完整性约束条件:数据模型的组成部分约束数据库中数据的语义。
  2. DBMS 应提供定义数据库完整性约束条件,并把它们作为模式的一部分存入数据库中。

完整性控制机制
检查用户发出的操作请求是否违背了完整性约束条件

违约反应
如果发现用户的操作请求使数据违背了完
整性约束条件,则采取一定的动作来保证
数据的完整性。

实体完整性

一、实体完整性定义

  1. 关系模型的实体完整性
    ➢ CREATE TABLE 中用 PRIMARY KEY 定义
  2. 单属性构成的码有两种说明方法
    ➢ 定义为列级约束条件
    ➢ 定义为表级约束条件
  3. 对多个属性构成的码只有一种说明方法
    ➢ 定义为表级约束条件

【例 1】
将 Student 表中的 Sno 属性定义为码
(1)在列级定义主码

1
2
3
4
5
6
CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY,
Sname CHAR(20) NOT NULL
Ssex CHAR(2) ,
Sage SMALLINT,
Sdept CHAR(20));
CPP

(2)在表级定义主码

1
2
3
4
5
6
7
8
CREATE TABLE Student
(Sno CHAR(9),
Sname CHAR(20) NOT NULL
Ssex CHAR(2) ,
Sage SMALLINT,
Sdept CHAR(20),
PRIMARY KEY (Sno)
);
CPP

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

  1. 插入或对主码列进行更新操作时,RDBMS 按照实体完整性规则自动进行检查。包括:
    ➢ 检查主码值是否唯一,如果不唯一则拒绝插入或修改。检查记录中主码值是否唯一的一种方法是进行全表扫描。
    ➢ 检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改。

参照完整性

一、参照完整性定义

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

【例 2】
例如,关系 SC 中一个元组表示一个学生选修的某门课程的成绩,
(Sno,Cno)是主码。Sno,Cno 分别参照引用 Student 表的主
码和 Course 表的主码
定义 SC 中的参照完整性

1
2
3
4
5
6
7
8
9
10
11
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)
/*在表级定义参照完整性*/
);
CPP

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


1. 参照完整性违约处理
➢ 拒绝(NO ACTION)执行:默认策略
➢ 级联(CASCADE)操作
➢ 设置为空值(SET-NULL)
对于参照完整性,除了应该定义外码,还应定义外码列==是否允许空值==

【例 3】
显式说明参照完整性的违约处理示例

1
2
3
4
5
6
7
8
9
10
11
12
13
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)
ON DELETE CASCADE /*级联删除SC表中相应的元组*/
ON UPDATE CASCADE, /*级联更新SC表中相应的元组*/
FOREIGN KEY (Cno) REFERENCES Course(Cno)
ON DELETE NO ACTION
/*当删除course 表中的元组造成了与SC表不一致时拒绝删除*/
ON UPDATE CASCADE
/*当更新course表中的cno时,级联更新SC表中相应的元组*/ )
CPP

用户定义的完整性

  1. 用户定义的完整性就是针对某一具体应用的数据必须满足的语义要求
  2. RDBMS 提供,而不必由应用程序承担

一、属性上的约束条件的定义

CREATE TABLE 时定义
➢ 列值非空(NOT NULL)
➢ 列值唯一(UNIQUE)
➢ 检查列值是否满足一个布尔表达式(CHECK)

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

  • 插入元组或修改属性的值时,RDBMS 检查属性上的约束条件是否被满足
  • 如果不满足则操作被拒绝执行

三、元组上的约束条件的定义

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

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

  1. 插入元组或修改属性的值时,RDBMS 检查元组上的约束条件是否被满足
  2. 如果不满足则操作被拒绝执行

完整性约束命名子句

  1. CONSTRAINT 约束
1
2
3
4
CONSTRAINT <完整性约束条件名>
[PRIMARY KEY短语
|FOREIGN KEY短语
|CHECK短语]
CPP
  1. 修改表中的完整性限制
    使用 ALTER TABLE 语句修改表中的完整性限制

域中的完整性限制

SQL 支持域的概念,并可以用 CREATE DOMAIN 语句建立一个域以及该域应该满足的完整性约束条件。

触发器

  1. 触发器(Trigger)是用户定义在关系表上的一类由事件驱动的特殊过程
    ➢ 由服务器自动激活
    ➢ 可以进行更为复杂的检查和操作,具有更精细和更强大的数据控制能力

一、定义触发器
1. CREATE TRIGGER 语法格式

1
2
3
4
CREATE TRIGGER <触发器名>
{BEFORE | AFTER} <触发事件> ON <表名>
FOR EACH {ROW | STATEMENT}
[WHEN <触发条件>] <触发动作体>
CPP

2.定义触发器的语法说明
1)创建者:表的拥有者
2)触发器名
3)表名:触发器的目标表
4)触发事件:INSERT、DELETE、UPDATE
5)触发器类型:
➢ 行级触发器(FOR EACH ROW)
➢ 语句级触发器(FOR EACH STATEMENT)
6)触发条件
➢ 触发条件为真
➢ 省略 WHEN 触发条件
7) 触发动作体
➢ 触发动作体可以是一个匿名 PL/SQL 过程块
➢ 也可以是对已创建存储过程的调用

【例 4】
定义一个 BEFORE 行级触发器,为教师表 Teacher 定义完整性规则“教授的工资不得低于 4000 元,如果低于 4000 元,自动改为 4000 元”。

1
2
3
4
5
6
7
8
9
10
CREATE TRIGGER Insert_Or_Update_Sal
BEFORE INSERT OR UPDATE ON Teacher
/*触发事件是插入或更新操作*/
FOR EACH ROW /*行级触发器*/
AS BEGIN /*定义触发动作
体,是PL/SQL过程块*/
IF (new.Job='教授') AND (new.Sal < 4000) THEN
new.Sal :=4000;
END IF;
END;
CPP

激活触发器

  1. 触发器的执行,是由触发事件激活的,并由数据库服务器自动执行
  2. 一个数据表上可能定义了多个触发器
    同一个表上的多个触发器激活时遵循如下的执行顺序:
    (1) 执行该表上的 BEFORE 触发器;
    (2) 激活触发器的 SQL 语句;
    (3) 执行该表上的 AFTER 触发器

删除触发器

  1. 删除触发器的 SQL 语法:
1
DROP TRIGGER <触发器名> ON <表名>;
CPP
  1. 触发器必须是一个已经创建的触发器,并且只能由具有相应权限的用户删除

小结

  1. 数据库的完整性是为了保证数据库中存储的数据是正确的
  2. RDBMS 完整性实现的机制
    ➢ 完整性约束定义机制
    ➢ 完整性检查机制
    ➢ 违背完整性约束条件时 RDBMS 应采取的动作

    写在最后:
    本数据库专栏是由爱吃老谈酸菜的 DV 一同完成的,博客链接在主页友链,是我的好哥们 ✈
    Name:风骨散人,目前是一名双非在校大学生,预计考研,热爱编程,热爱技术,喜欢分享,知识无界,希望我的分享可以帮到你!名字的含义:我想有一天我能有能力随心所欲不逾矩,不总是向生活低头,有能力让家人拥有富足的生活而不是为了生计而到处奔波。“世人慌慌张张,不过是图碎银几两。偏偏这碎银几两,能解世间惆怅,可让父母安康,可护幼子成长 …”
    文章主要内容:
    Python,C++,C 语言,JAVA,C#等语言的教程
    ACM 题解、模板、算法等,主要是数据结构,数学和图论
    设计模式,数据库,计算机网络,操作系统,计算机组成原理
    Python 爬虫、深度学习、机器学习
    计算机系408考研的所有专业课内容
    目前还在更新中,先关注不迷路。微信公众号,cnblogs(博客园),CSDN 同名“风骨散人”

如果有什么想看的,可以私信我,如果在能力范围内,我会发布相应的博文!
感谢大家的阅读!😘 你的点赞、收藏、关注是对我最大的鼓励!


『数据库』这篇数据库的文章真没人看-数据库完整性
https://chiamzhang.github.io/2024/06/29/『数据库』这篇数据库的文章真没人看-数据库完整性/
Author
Chiam
Posted on
June 29, 2024
Licensed under