数据库完整性例题

Posted Fmm-PMO

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库完整性例题相关的知识,希望对你有一定的参考价值。

本篇主要总结第5章数据库完整性例题的前一部分,主要内容是三大完整性。数据库的完整性是指数据的正确性和相容性。
数据的正确性

数据是符合现实世界语义 ,反映了当前实际状况的

数据的相容性
同一对象在不同关系表中的数据是 符合逻辑的
一、实体完整性
1.定义实体完整性

关系模型的实体完整性在create table中用primary key定义,对单属性构成的码有两种说明方法,一种是定义列级约束条件,另一种是定义为表级约束条件。对多个属性构成的码只有一种说明方法,即定义为表级约束条件。

例1:将Student表中的Sno属性定义为码

create table Student
(Sno char(9) primary key, --在列级定义主码
 Sname char(20) unique,
 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), -- 只能在表级定义主码,因为有两个属性列
);
2.实体完整性检查和违约处理

用primary key短语定义了关系的主码后,每当用户程序对基本表插入一条记录或对主码列进行更新操作时,关系数据库管理系统将按照实体完整性规则自动进行检查。包括

(1)检查主码值是否唯一,如果不唯一则拒绝插入或修改。
(2)检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改。,从而保证了实体完整性。

为了验证上述两个检查,提前向两个表中插入一些数据。
Student表

继续向Student表中添加Sno为201215121,Sname为张三,Ssex为男,Sage为20,Sdept为IS

insert into Student
values('201215121','张三','男',20,'IS');

执行语句,插入失败,验证了(1)

SC表

继续向SC表插入Sno为201215121,Cno为空,Grade为空

insert into SC
values('201215121',NULL,NULL);

执行后,会发现失败,Sno和Cno共同为主码,Cno不能为空,而不是主码的Grade却可以正常为空,验证了(2)

二、参照完整性
1.定义参照完整性

关系模型的参照完整性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) -- 在表级定义参照完整性
);
2.参照完整性检查和违约处理

对被参照表和参照表进行增、删、改操作时有可能破坏参照完整性,必须进行检查以保证这两个表的相容性。例如对表SC和Student有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 cascade, -- 当更新Student表中的Sno时,级联更新SC表中相应的元组
 foreign key(Cno)references Course(Cno) -- 在表级定义参照完整性
 on delete no action -- 但删除Course表中的元组造成与SC表不一致时,拒绝删除
 on update cascade -- 当更新Course表中的Cno时,级联更新
 );
三、用户自定义完整性

用户定义的完整性就是针对某一具体应用的数据必须满足的语义要求。

1.属性上约束条件
1.1属性上约束条件的定义

在create table中定义属性的同时,可以根据应用要求定义属性上的约束条件,即属性值限制,包括:

列值非空(not null)。列值唯一(unique)。检查列值是否满足一个条件表达式(check短语)

(1)不允许取空值

在定义SC表时,说明Sno、Cno、Grade属性不允许取空值

create table SC
(Sno char(9)not null,
 Cno char(4)not null,
 Grade smallint not null,
 primary key(Sno,Cno), -- 在表级定义实体完整性,隐含了Sno,Cno不允许取空值,在列级俄不允许取空值的定义可不写
);
(2)列值唯一

建立部门表DEPT,要求部门名称Dname列取值唯一,部门编号Deptno列为主码

create table DEPT
(Deptno numeric(2),
 Dname char(9) unique not null,
 Location char(10),
 primary key(Deptno)
);
(3)用CHECK短语指定列值应该满足的条件

Student表的Ssex只允许取“男”或“女”。

create table Student
(Sno char(9) primary key,
 Sname char(20) not null,
 Ssex char(2) check (Ssex in('男','女')), -- 性别属性只能取男或女
 Sage smallint,
 Sdept char(20)
);

SC表的Grade的值应该在0和100之间。

create table SC
(Sno char(9),
 Cno char(4),
 Grade smallint check(Grade>=0 and Grade<=100),
 primary key(Sno,Cno),
 foreign key(Sno)references Student(Sno),
 foreign key(Cno)references Course(Cno)
);
1.2.属性上约束条件的检查和违约处理

当插入元组或者修改属性的值时,关系数据库管理系统会检查属性上的约束条件是否满足,若不满足则拒绝执行。

2.元组上的约束条件
2.1元组上约束条件的定义

元组级的限制可以设置不同属性之间的取值的相互约束条件

例:当学生的性别是男时,其名字不能以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.%')
);
2.2元组上约束条件的检查和违约处理

处理方式同属性上约束条件的检查和违约处理。

四、完整性约束命名子句

完整性约束命名子句constraint,用来对完整性约束条件命名,从而可以灵活地增加、删除一个完整性约束条件

1.完整性约束命名子句

constraint<完整性约束条件名><完整性约束条件>
完整性约束条件名包括:not null, unique, primary key, foreign key, check短语等

例1:建立学生登记表Student,要求学号在90000~99999之间,姓名不能取空值,年龄小于30,性别只能是“男”或“女”。

create table Student
(Sno numeric(6)
 	constraint C1 check (Sno between 90000 and 999999),
 Sname char(20)
	constraint C2 not null,
 Sage numeric(3)
 	constraint C3 check(Sage<30),
 Ssex char(2)
 	constraint C4 check(Ssex in('男','女')),
 	constraint StudentKey primary key(Sno)
);

在Student表上建立了5个约束条件,包括主码约束(StudentKey)和C1 C2 C3 C4这4个列级约束

例2:建立教师表TEACHER,要求每个教师的应发工资不低于3000元。应发工资是工资列Sal与扣除项Deduct之和。

create table TEACHER
(Eno numeric(4) primary key,
 Ename char(10),
 Job char(8),
 Sal numeric(7,2),
 Deduct numeric(7,2),
 Deptno numeric(2),
 constraint TEACHERFKey foreign key(Deptno)
 references DEPT(Deptno),
 constraint C11 check(Sal+Deduct>=3000)
);
2.修改表中的完整性限制

可以使用alter table语句修改表中的完整性限制

例1:去掉例5.10 Student表中对性别的限制。

alter table Student
	drop constraint C4;

例2:修改表Student中的约束条件,要求学号改为在900000~999999之间,年龄由小于30改为小于40

alter table Student
	drop constraint C1;
alter table Student
	add constraint C1 check(Sno between 900000 and 999999);
alter table Student
	drop constraint C3;
alter table Student
	add constraint C3 check(Sage<40);
五、断言

在SQL中可以使用数据定义语言中的create assertion语句,通过声明性断言来指定更具一般性的约束。断言创建以后,任何对断言中所涉及关系的操作都会触发关系数据库管理系统对断言的检查,任何使断言不为真值的操作都会被拒绝执行。但T-SQL中没有断言,标准SQL中有,所以这里只给出语句格式例子

1.创建断言的语句格式

create assertion <断言名> < check子句 >
每个断言都被赋予一个名字,check子句中的约束条件与where子句的约束表达式类似

例1: 限制数据库课程最多60名学生选修

create assertion ASSE_SC_DB_NUM
	check (60 >= (select count(*)
                 from Course,SC
    		     where SC.Cno=Course.Cno and 					
				 Course.Cname ='数据库')
			   	);

如果选修数据库课程的人数已经超过60人,check子句返回假,对SC表的插入操作都被标记

例2:限制每一门课程最多有60名学生选修

create assertion ASSE_SC_CNUM1
		check(60 >= all (select count(*) 		   				         
		from SC 
	    group by cno)
        );

例3:限制每个学期每一门课程最多有60名学生选修

alter table SC add term date;-- 先修改SC表,增加term属性,类型为DATE
-- 定义断言
create assertion ASSE_SC_CNUM2
	check(60>=all(select count(*) from SC group by cno,term);
2.删除断言的语句格式
drop assertion<断言名>
六、课程总结
这一章对数据库安全性有了一些初步的了解,同时复习了数据库的三大完整性,在一定程度上对数据库的安全性提供了保障。

以上是关于数据库完整性例题的主要内容,如果未能解决你的问题,请参考以下文章

例题

数据库期末复习之例题汇总

《数据库系统概论》 -- 5 数据库完整性

数据库完整性(实体完整性,参照完整性,用户定义完整性)

数据库完整性

完整性约束