暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

第五章 数据库完整性(1)——总述与实体完整性

凯哥的故事 2020-05-18
698

总 述

数据库的完整性(integrity)是指数据的正确性(correctness)和相容性(compat-ability)。数据的正确性是指数据是符合现实世界语义、反映当前实际状况的;数据的相容性是指数据库同一对象在不同关系表中的数据是符合逻辑的。

例如,学生的学号必须唯一,性别只能是男或女,本科学生年龄的取值范围为14~50的整数,学生所选的课程必须是学校开设的课程,学生所在的院系必须是学校已成立的院系等。

数据的完整性和安全性是两个既有联系又不尽相同的概念。数据的完整性是为了防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据。数据的安全性是保护数据库防止恶意破坏和非法存取。因此,完整性检查和控制的防范对象是不合语义的、不正确的数据,防止它们进入数据库。安全性控制的防范对象是非法用户和非法操作,防止他们对数据库数据的非法存取。

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

①提供定义完整性约束条件的机制

完整性约束条件也称为完整性规则,是数据库中的数据必须满足的语义约束条件。它表达了给定的数据模型中数据及其联系所具有的制约和依存规则,用以限定符合数据模型的数据库状态以及状态的变化,以保证数据的正确、有效和相容。SQL标准使用了一系列概念来描述完整性,包括关系模型的实体完整性、参照完整性和用户定义完整性。这些完整性一般由SQL的数据定义语言语句来实现,它们作为数据库模式的一部分存入数据字典中。

②提供完整性检查的方法

​数据库管理系统中检查数据是否满足完整性约束条件的机制称为完整性检查。一般在INSERT、UPDATE、DELETE语句执行后开始检查,也可以在事务提交时检查。检查这些操作执行后数据库中的数据是否违背了完整性约束条件。

③进行违约处理

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

早期的数据库管理系统不支持完整性检查,因为完整性检查费时费资源。现在商用的关系数据库管理系统产品都支持完整性控制,即完整性定义和检查控制由关系数据库管理系统实现,不必由应用程序来完成,从而减轻了应用程序员的负担。更重要的是,关系数据库管理系统使得完整性控制成为其核心支持的功能,从而能够为所有用户和应用提供一致的数据库完整性。因为由应用程序来实现完整性控制是有漏洞的,有的应用程序定义的完整性约束条件可能被其他应用程序破坏,数据库数据的正确性仍然无法保障。

第二章(3)中的关系的完整性已经讲解了关系数据库三类完整性约束的基本概念,下面将介绍 SQL 语言中实现这些完整性控制功能的方法。

实体完整性

定义实体完整性

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

例1】将Student表中的Sno属性定义为码。

CREATE TABLE Student

    ​(Sno CHAR(9) PRIMARY KEY, 

    ​Sname CHAR(20) NOT NULL,

    ​Ssex CHAR(2),

    ​Sage SMALLINT,

    ​Sdept CHAR(20)

);
或者

CREATE TABLE Student

    ​(Sno CHAR(9),

    ​Sname CHAR(20) NOT NULL,

    ​Ssex CHAR(2),

    ​Sage SMALLINT,

    ​Sdept CHAR(20),

    ​PRIMARY KEY(Sno)

);

例2】将SC表中的Sno、Cno属性组定义为码。

CREATE TABLE SC

    ​(Sno CHAR(9) NOT NULL,

    ​Cno CHAR(4) NOT NULL,

    ​Grade SMALLINT,

    ​PRIMARY KEY(Sno,Cno)

);

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

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

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

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

从而保证了实体完整性。

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

全表扫描是十分耗时的。为了避免对基本表进行全表扫描,关系数据库管理系统一般都在主码上自动建立一个索引,如下图的B+树索引,通过索引查找基本表中是否已经存在新的主码值将大大提高效率。例如,如果新插入记录的主码值是25,通过主码索引,从 B+树的根结点开始查找,只要读取三个结点就可以知道该主码值已经存在,所以不能插入这条记录。这三个结点是根结点(51)、中间结点(12 30)和叶结点(15 20 25)。如果新插入记录的主码值是86,也只要查找三个结点就可以知道该主码值不存在,所以可以插入该记录。


文章转载自凯哥的故事,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论