数据库的完整性
5.1 实体完整性
5.1.1 实体完整性定义
(1)关系模型的实体完整性
CREATE TABLE中用PRIMARY KEY定义
(2)单属性构成的码有两种说明方法
定义为列级约束条件
定义为表级约束条件
(3)对多个属性构成的码只有一种说明方法
定义为表级约束条件
[例5.1] 将Student表中的Sno属性定义为码
(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)
);
5.1.2 实体完整性检查和违约处理
(1)插入或对主码列进行更新操作时,关系数据库管理系统按照实体完整性规则自动进行检查。包括:
检查主码值是否唯一,如果不唯一则拒绝插入或修改
检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改
(2)检查记录中主码值是否唯一的一种方法是进行全表扫描
依次判断表中每一条记录的主码值与将插入记录上的主码值(或者修改的新主码值)是否相同
(3)表扫描缺点
十分耗时
(4)为避免对基本表进行全表扫描,RDBMS核心一般都在主码上自动建立一个索引
(5)B+树索引
例如,
新插入记录的主码值是25
通过主码索引,从B+树的根结点开始查找
读取3个结点:根结点(51)、中间结点(12 30)、叶结点(15 20 25)
该主码值已经存在,不能插入这条记录
5.2 参照完整性
关系模型的参照完整性定义
在CREATE TABLE中用FOREIGN KEY短语定义哪些列为外码
用REFERENCES短语指明这些外码参照哪些表的主码
例如,关系SC中(Sno,Cno)是主码。Sno,Cno分别参照Student表
的主码和Course表的主码
[例5.3]定义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)
/*在表级定义参照完整性*/
);
5.2.2 参照完整性检查和违约处理
例如,对表SC和Student有四种可能破坏参照完整性的情况 :
(1)SC表中增加一个元组,该元组的Sno属性的值在表S