数据库的完整性:指数据的正确性和相容性
- 数据的正确性:是指数据是符合现实世界语义,反映了当前实际状况的
- 数据的相容性:是指数据库同一对象在不同关系表中的数据是符合逻辑的
数据库安全性与完整性的区别与联系:
- 数据的完整性
- 防止数据库中存在不符合语义的数据,也就是不正确的数据
- 防范对象:不合语义的、不正确的数据
- 数据的安全性
- 保护数据库,防止恶意的破坏和非法的存取
- 防范对象:非法用户和非法操作
5.1 实体完整性
-
内容:若属性(或属性组)A是基本关系R的主属性,则属性A不能取空值(空值就是“不知道”或“不存在”或“无意义”的值)
-
定义:CREATE TABLE中用PRIMARY KEY定义
-
单属性构成的码有两种说明方法 :
-
定义为列级约束条件
/* 将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) /* 在表级定义主码 */ );
-
-
对多个属性构成的码只有一种说明方法:
-
定义为表级约束条件
/* 将SC表中的Sno,Cno属性组定义为码 */ CREATE TABLE SC (Sno CHAR(9) NOT NULL, Cno CHAR(4) NOT NULL, Grade SMALLINT, PRIMARY KEY (Sno,Cno) /* 只能在表级定义主码 */ );
-
-
-
检查和违约处理:插入记录或对主码列进行更新操作时,关系数据库管理系统按照实体完整性规则自动进行检查,包括:
- 检查主码值是否唯一,如果不唯一则拒绝插入或修改
- 检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改
5.2 参照完整性
-
内容:若属性(或属性组)F是基本关系R的外码,它与基本关系S的主码Ks相对应(基本关系R和S不一定是不同的关系),则对于R中每个元组在F上的值必须为:
- 或者取空值(F的每个属性值均为空值)
- 或者等于S中某个元组的主码值
-
定义:在CREATE TABLE中用FOREIGN KEY定义哪些列为外码,用REFERENCES指明这些外码参照哪些表的主码
-
在表级定义参照完整性
/* 关系SC中(Sno,Cno)是主码 Sno,Cno分别参照Student表和Course表的主码 */ /* 定义SC中的参照完整性 */ 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) /*在表级定义参照完整性*/ );
-
-
检查和违约处理:一个参照完整性将两个表中的相应元组联系起来,对被参照表和参照表进行增删改操作时有可能破坏参照完整性,必须进行检查
-
拒绝执行(NO ACTION)
不允许该操作执行(该策略一般设置为默认策略) -
级联操作(CASCADE)
当删除或修改被参照表(Student)的一个元组造成了与参照表(SC)的不一致,则删除或修改参照表中的所有造成不一致的元组 -
设置为空值(SET-NULL)
当删除或修改被参照表的一个元组时造成了不一致,则将参照表中的所有造成不一致的元组的对应属性设置为空值/* 显式说明参照完整性的违约处理示例 */ 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表中相应的元组*/ );
-