数据完整性定义:
数据库完整性(Database Integrity)是指数据库中数据在逻辑上的一致性、正确性、有效性和相容性。数据库完整性由各种各样的完整性约束来保证,因此可以说数据库完整性设计就是数据库完整性约束的设计。数据库完整性约束可以通过DBMS或应用程序来实现,基于DBMS的完整性约束作为模式的一部分存入数据库中。可以理解为数据的语义正确性。
区分数据完整性和数据安全性
–数据的完整性
防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据
防范对象:不合语义的、不正确的数据
–数据的安全性
保护数据库防止恶意的破坏和非法的存取
防范对象:非法用户和非法操作
那么为了维护数据的完整性,DBMS必须做到:
1.提供定义完整性的约束条件的机制(保证数据的更新和插入符合约束,从而保证了数据完整性)
2.提供完整性检查方法(检查数据中是否出现了非完整性数据)
3.提供违约处理(若发现了非完整性数据要进行处理)
为什么需要数据完整性?
数据库完整性对于数据库应用系统非常关键,其作用主要体现在以下几个方面:
1.数据库完整性约束能够防止合法用户使用数据库时向数据库中添加不合语义的数据。
2.利用基于DBMS的完整性控制机制来实现业务规则,易于定义,容易理解,而且可以降低应用程序的复杂性,提高应用程序的运行效率。同时,基于DBMS的完整性控制机制是集中管理的,因此比应用程序更容易实现数据库的完整性。
3.合理的数据库完整性设计,能够同时兼顾数据库的完整性和系统的效能。比如装载大量数据时,只要在装载之前临时使基于DBMS的数据库完整性约束失效,此后再使其生效,就能保证既不影响数据装载的效率又能保证数据库的完整性。
4.在应用软件的功能测试中,完善的数据库完整性有助于尽早发现应用软件的错误。
完整性表现
关系模型
关系完整性的用于保证数据库中数据的正确性。系统在进行更新、插入或删除等操作时都要检查数据的完整性,核实其约束条件,即关系模型的完整性规则。在关系模型中有四类完整性约束:实体完整性、域完整性、参照完整性和用户定义的完整性,其中实体完整性和参照完整性约束条件,称为关系的两个不变性
实体完整性
(1)实体完整性(Entity Integrity)。实体完整性指表中行的完整性。主要用于保证操作的数据(记录)非空、唯一且不重复。即实体完整性要求每个关系(表)有且仅有一个主键,每一个主键值必须唯一,而且不允许为“空”(NULL)或重复。
(2)实体完整性规则要求。若属性A是基本关系R的主属性,则属性A不能取空值,即主属性不可为空值。因为主键是数据库的中某一行的唯一标志。如果主键取空值,关系数据库中就会存在不可区分的实体记录。这里NULL不是指0,而是没有值。而对于非主键可以取NULL。这一规则被称为数据库的实体完整性要求。
实体完整性的定义:如果码为多个列属性,则只能定义为表级约束条件,如果码为单个列属性则可以定义为表级约束条件也可以定义为列级约束条件。
检查方法:检查主码是否唯一,如果主码不唯一则拒绝插入或者修改(2)检查主码的属性值是否为空,如果为空则拒绝操作
参照完整性(Referential Integrity)
首先看一下什么是外码:
设F是基本关系R的一个或一组属性,但不是关系R的码。如果F与基本关系S的主码Ks相对应,则称F是基本关系R的外码。
对于参照完整性来说,属于表间规则。对于永久关系的相关表,在更新、插入或删除记录时,如果只改其一,就会影响数据的完整性。如删除父表的某记录后,子表的相应记录未删除,致使这些记录称为孤立记录。对于更新、插入或删除表间数据的完整性,统称为参照完整性。通常,在客观现实中的实体之间存在一定联系,在关系模型中实体及实体间的联系都是以关系进行描述,因此,操作时就可能存在着关系与关系间的关联和引用。在关系数据库中,关系之间的联系是通过公共属性实现的。这个公共属性经常是一个表的主键,同时是另一个表的外键。参照完整性体现在两个方面:实现了表与表之间的联系,外键的取值必须是另一个表的主键的有效值,或是“空”值。
定义:在CREATE TABLE 中用FOREIGN KEY短语来定义那些列是外码,用REFERENCES指示这些外码参考了哪些列的主码。
FOREIGN KEY(NAME) REFERENCES TABLE_NAME(NAME)
可能破坏参照完整性的情况
参照完整性的违约处理:
1)拒绝执行(NO ACTION):既然你违规了,我拒绝。
2)级联操作(CASCADE):有时候拒绝执行是不对的,比如说,我想在想给某个班换个班主任,那么我需要将班级和人员管理级联修改。
3)设置为空值(SET-NULL):折中操作,但是要注意外码列是否允许空值,如果不允许为空,则该处理无效。
用户定义的完整性
•用户定义的完整性就是针对某一具体应用的数据必须满足的语义要求
从属性和元组两方面进行分析:
1)属性上约束条件的定义:
列值不允许为空(NOT NULL)
列值不允许相同(UNIQUE)
检查列值是否满足一个布尔表达式(CHECK)
2)属性上的约束条件检查和违约处理
插入元组或者修改属性的值的时候,RDBMS会根据约束条件检查插入或者更改是否符合要求。如果不符合要求直接拒绝操作
3)元组上约束条件的定义:
通过CHECK设置约束条件。即元组级别的限制,此时重点在于不同列属性之间的关系。
4)元组上约束条件的检查和违约处理
同属性上的一致,RDBMS会根据约束条件检查,如果不符合要求直接拒绝操作
使用完整性约束命名子句
我们可以通过完整性约束命名子句来创建完整性约束并标识相关约束以及对相关约束进行操作。
创建完整性约束命名子句
格式: CONSTRAINT <完整性约束条件名> [PRIMARY KEY短语 |FOREIGN KEY短语 |CHECK短语]
修改完整性约束命名子句:
使用ALTER TABLE语句修改表中完整性限制:
ALTER TABLE Student DROP CONSTRAINT C1;
ALTER TABLE Student ADD CONSTRAINT C1 CHECK (Sno BETWEEN 900000 AND 999999)
域完整性
域完整性同样是用户完整性的一种,不过通过定义 域来实现。该域中指明了应满足的约束条件。
[例14]建立一个性别域,并声明性别域的取值范围
CREATE DOMAIN GenderDomainCHAR(2)
CHECK (VALUE IN ('男','女') );
这样 对Ssex的说明可以改写为
Ssex GenderDomain