导读:
本文深入的介绍了数据库的完整性.
O、 数据库的完整性(总体概述)
一、实体完整性
二、参照完整性
三、用户定义完整性
O、数据库的完整性
是指数据是符合现实世界语义,反映了当前实际情况。
是指数据库同一对象在不同关系表中的数据是符合逻辑的。
数据的完整性和安全性是两个不同概念
防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据
防范对象:不合语义、不正确的数据
保护数据库 防止恶意的破坏和非法的存取
防范对象:非法用户和非法操作
为维护数据库的完整性,数据库管理系统必须:
1. 提供定义完整性约束条件的机制
完整性约束条件也称为完整性规则,
是数据库中的数据必须满足的语义约束条件。
SQL标准使用了一系列概念来描述完整性,
包括关系模型的实体完整性/参照完整性和用户定义完整性。
这些完整性一般由SQL的数据定义语言语句来实现
2.提供完整性检查机制
数据库管理系统中检查数据是否满足完整性约束条件的机制称为完整性检查
一般在INSERT、 UPDATE、DELETE 语句执行后开始检查,
也可以再事务提交时检查
3.违约处理
数据库管理系统若发现用户的操作未被了完整性约束条件,就采取一定的行动。
拒绝(NO ACTION) 执行该操作
级连(CASCADE) 执行其他操作
由DBMS进行完整性检查的好处:
不必由应用程序来完成,从而减轻了应用程序员的负担。
能够为所有的用户和所有的应用提供一致的数据库完整性,避免出现漏洞。
一、实体完整性
1.实体完整性的定义
关系模型的实体完整性:
CREATE TABLE 中用 PRIMARY KEY 定义
->单属性构成的码有两种说明方法
* 定义为列级约束条件
* 定义为表级约束条件
->对多个属性构成的码只有一种说明方法
* 定义为表级约束条件
(1)在列级定义主码
CREATE TABLE Student
( Sno CHAR(9)PRIMARY KEY,
Sname CHAR(20) NOT NULL,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
);
(2)在表级定义主码
CREATE TABLE Student
( Sno CHAR(9) ,
Sname CHAR(20) NOT NULL,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20),
PRIMARY KEY (Sno)
);
例子:
将SC 表中的Sno, Cno属性组定义为码
CREATE TABLE SC
{
Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY (Sno,Cno) /*只能在 表级定义主码*/
}
2.实体完整性检查和违约处理
插入或对主码列进行更新操作时,
关系数据库管理系统按照实体完整性规则自动进行检查。
1.查主码值是否唯一,如果不唯一则拒绝插入或修改。
2.检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改。
检查激励中主码值是否唯一的一种方法是进行全表扫描。
依次判断表中每一条记录的主码值与将插入记录上的主码值(或则修改的新主码值)是否相同。
全表扫描的缺点:十分耗时
为避免对基本表进行全表扫描,RDBNS核心一般都在主码上自动建立一个索引。
二、参照完整性
1.参照完整性的定义
若属性(或属性组)F是基本关系R的外码它与基本关系S的主码Ks 相对应(基本关系R和S不一定是不同的关系),则对于R中每个元组在F上的值必须为:
或取空值(F的每个属性均为空值)
或者等于S中某个元组的主码值
2.关系模型的参照完整性定义
在CREATE TABLE 中一百个 FOREIGN KEY 短语定义哪些列为外码。
用REFERENCES 短语指明这些外码参照哪些表的主码
例:Student表中的 Sdept是外码,参照DEPT表中的主码Deptno
列级约束条件
CREATE TABLE Student
( Sno CHAR(9) PRIMARY KEY,
Sname CHAR(20) UNIQUE,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20) FOREIGN KEY REFERENCES DEPT(Deptno)
);
表级约束条件
CREATE TABLE Student
( Sno CHAR(9) PRIMARY KEY,
Sname CHAR(20) UNIQUE,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20) ,
FOREIGN KEY(Sdept) REFERENCES DEPT(Deptno)
);
例:关系SC中(Sno, Cno)是主码。Sno, Cno分别参照 Studen t表的主码和 Course 表的主码。
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.参照完整性检查和违约处理
参照完整性检查
一个参照完整性将两个表中相应的元组联系起来。
对被参照表和参照表进行增删改操作时有可能破坏参照完整性,必须进行检查。
参照完整性违约处理
拒绝(NO ACTION)执行
不允许该操作执行。该策略一般设置为默认策略。
级联(CASCADE)操作
当删除或修改被参照表(Student)的一个元组造成了与参照表(SC)的不一致,则删除或者修改参照表中的所有造成不一样元组。
设置为空值(SET-NULL)
当删除或者修改被参照表的一个元组时造成了不一致,则将参照表中所有造成不一致的元组的对应属性设置为空值。
三、用户定义完整性
用户定义的完整性是:针对于某一具体应用的数据必须满足的语义要求。
关系数据库管理系统提供了定义和检验用户定义完整性的机制,不必由应用程序承担。
1、属性上的约束条件的定义
CREATE TABLE 时定义属性上的约束条件
列值非空(NOT NULL)
列值唯一(UNIQUE)
检查列值是否满足一个条件表达式(CHECK)
例:
Sname 唯一; Sage 不可空; Sage 必须是男或者女。
CREATE TABLE Student
( Sno CHAR(9) PRIMARY KEY,
Sname CHAR(20)UNIQUE,
Ssex CHAR(2)CHECK (Ssex IN ('男', '女')),
Sage SMALLINTNOT NULL,
Sdept CHAR(20) ,
);
2.属性上的约束条件检查和违约处理
插入元组或修改属性的值时,关系数据库管理系统RDBMS检查属性上的约束条件是否被满足。
如果不满足则操作被拒绝执行。
3.元组上的约束条件定义
元组级的限制:可以设置不同属性之间的相互约束条件
例如:数据库课程的学分不能低于两分
在CREATE TABLE 时可以用 CHECK 子句定义元组上的约束条件
例:当学生性别是男时,其名字不能以Ms. 打头。
CREATE TABLE Student
( Sno CHAR(9) ,
Sname CHAR(20) NOT NULL,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20),
PRIMARY KEY (Sno),
CHECK (Ssex = '女' OR Sname NOT LIKE 'Ms.%')
);
4.元组上的约束条件检查和违约处理
插入元组或修改属性的值时,关系数据库管理系统检查元组上的约束条件是否被满足。
如果不满足则操作被拒绝执行。
PS:
DBMS:数据库管理系统
RDBMS:关系数据库管理系统
END
本文来自企鹅号 - python黑科技媒体
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文来自企鹅号 - python黑科技媒体
如有侵权,请联系 cloudcommunity@tencent.com 删除。