数据库原理
咸阳师范学院信息工程学院 第五章 数据库完整性 本章主要教学内容: 5.1 实体完整性 5.2 参照完整性
5.3 用户定义的完整性 5.4 完整性约束命名子句 5.6 触发器 重点及难点:
了解什么是数据库完整性
掌握数据库的三类完整性 第五章 数据库完整性 数据库的完整性
数据的正确性和相容性
防止不合语义的数据进入数据库。 完整性:真实地反映现实世界 1.提供定义完整性约束条件的机制
2.提供完整性检查的方法
3.违约处理
提供定义完整性约束条件的机制
完整性约束条件:数据模型的组成部分,约束数据库中数据的语义
DBMS应提供定义数据库完整性约束条件,并把它们作为模式的一部分存入数据库中 提供完整性检查的方法
检查用户发出的操作请求是否违背了完整性约束条件 违约处理
如果发现用户的操作请求使数据违背了完整性约束条件,则采取一定的动作来保证数据的完整性。
第五章 数据库完整性 5.1 实体完整性 5.2 参照完整性
5.3 用户定义的完整性 5.4 完整性约束命名子句 5.6 触发器 5.7 小结
5.1 实体完整性 5.1.1实体完整性定义
5.1.2实体完整性检查和违约处理 5.1.1实体完整性定义
关系模型的实体完整性在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) /*只能在表级定义主码*/ );
5.1实体完整性
5.1.1实体完整性定义
5.1.2实体完整性检查和违约处理 5.1.2实体完整性检查和违约处理
当用户程序对基本表插入一条记录或者对主码列进行更新操作时,RDBMS则进行实体完整性检查,包括
1.检查主码值是否唯一,如果不唯一则拒绝插入或修改。
2.检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改。 从而保证了实体完整性。 实体完整性检查和违约处理
检查记录中主码值是否唯一的一种方法是进行全表扫描。依次判断表中每一条记录的主码值与将插入记录上的主码值(或者修改的新主码值)是否相同。
Key1 F21 F31 F41 F51 Key2 F22 F32 F42 F52 Key3 F23 F33 F43 F53 Keyi F2i F3i F4i F5i 实体完整性检查和违约处理
全表扫描是十分耗时的。为了避免对基本表进行全表扫描,RDBMS核心一般都在主码上自动建立一个索引,通过索引查找基本表中是否已经存在新的主码值,将大大提高效率。 实体完整性检查和违约处理 第五章数据库完整性 5.1 实体完整性 5.2 参照完整性
5.3 用户定义的完整性 5.4 完整性约束命名子句 5.6 触发器 5.7 小结
5.2参照完整性
5.2.1参照完整性定义
5.2.2参照完整性检查和违约处理
关系模型的参照完整性在CREATE TABLE中用FOREIGN KEY短语定义哪些列为外码,用REFERENCES短语指明这些外码参照哪些表的主码。 5.2.1参照完整性定义
例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参照完整性
5.2.1参照完整性定义
5.2.2参照完整性检查和违约处理 5.2.2参照完整性检查和违约处理
一个参照完整性将两个表中的相应元组联系起来了。
对被参照表和参照表进行增删改操作时有可能破坏对照完整性,必须进行检查。 参照完整性检查和违约处理
当破坏参照完整性时,系统可以采用以下策略 1拒绝(NO ACTION)执行
不允许该操作执行。该策略一般设置为默认策略。 2级连(CASCADE)操作
当删除或修改被参照表的一个元组造成了与参照表的不一致,则删除或修改参照表中的所有造成不一致的元组。 参照完整性检查和违约处理 3设置为空值(SET-NULL)
当删除或修改被参照表的一个元组时造成了不一致,则将参照表中的所有造成不一致的元组的对应属性设置为空值。 参照完整性检查和违约处理
例4显式说明参照完整性的违约处理示例 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 /*当删除student表中的元组时,级连删除SC表中相应的元组*/
ON UPDATE CASEADE, /*当更新student表中的sno时,级连更新SC表中相应 的元组*/
参照完整性检查和违约处理
FOREIGN KEY(Cno) REFERENCES Course(Cno) /*在表级定义参照完整性*/
ON DELETE NO ACTION /*当删除course表中的元组造成与SC表不一致时拒绝删除*/
ON UPDATE CASEADE, /*当更新course表中的cno时,级连更新SC表中相应的元组*/ );
第五章 数据库完整性 5.1 实体完整性 5.2 参照完整性
5.3 用户定义的完整性 5.4 完整性约束命名子句 5.6 触发器 5.7 小结
用户定义的完整性就是针对某一具体应用的数据必须满足的语义要求。 5.3用户定义的完整性
5.3.1属性上的约束条件的定义
5.3.2属性上的约束条件检查和违约处理 5.3.3元组上的约束条件的定义
5.3.4 元组上的约束条件检查和违约处理 5.3.1属性上的约束条件的定义
在CREATE TABLE中定义属性的同时可以根据应用要求,定义属性上的约束条件,即属性限制,包括:
列值非空(NOT NULL短语) 列值唯一(UNIQUE短语)
检查列值是否满足一个布尔表达式(CHECK短语) 列值非空(NOT NULL短语)
例5在定义SC表时,说明Sno,Cno,Grade属性不允许取空值 CREATE TABLE SC
(Sno CHAR(9) NOT NULL, /*Sno属性不允许取空值*/ Cno CHAR(4) NOT NULL, /*Cno属性不允许取空值*/
Grade SMALLINT NOT NULL, /* Grade 属性不允许取空值*/ PRIMARY KEY(Sno,Cno), /*如果在表级定义实体完整性,隐含了Sno,Cno不允许取空值,则在列级不允许取空值的定义就不必须写了*/ … … ); 列值唯一
例6建立部门表DEPT,要求部门名称Dname列取值唯一,部门编号Deptno列为主码 CREATE TABLE DEPT (Deptno NUMERIC(2),
Dname CHAR(9) UNIQUE, /*要求Dname列值唯一*/ Location CHAR(10),
PRIMARY KEY (Deptno) );
用CHECK短语指定列值应该满足的条件
例7 Student表的Ssex只允许取得“男”或“女” CREATE TABLE Student
( Sno CHAR(9) PRIMARY KEY, /*在列级定义主码*/
Sname CHAR(8) NOT NULL, /*Sname属性不允许取空值*/ Ssex CHAR(2) CHECK (Ssex IN (‘男‘,’女‘)),
/*性别属性Ssex只允许取‘男’或‘女’*/
Sage SMALLINT, Sdept CHAR(20) );
例8 SC表的Grade的值应该在0和100之间 CREATE TABLE SC