数据库系统概论(第6版 王珊 杜小勇 陈红)第五章 数据库完整性 课后习题答案
本文整理了《数据库系统概论(第6版)》第五章“数据库完整性”的课后习题及补充习题答案,旨在为学习者提供清晰的参考,方便课后复习与巩固。
习题解答和解析
1. 什么是数据库的完整性?
答:数据库的完整性是指数据库数据的正确性和相容性。
2. 数据库的完整性概念与数据库的安全性概念有什么区别和联系?
答:数据的完整性和安全性是两个不同的概念,但是二者有一定的联系。
完整性是为了防止数据库中存在不符合语义的数据,防止错误信息的输入和输出,即所谓的垃圾进垃圾出(garbage in garbage out)所造成的无效操作和错误结果。
安全性是保护数据库防止恶意破坏和非法存取。
因此,完整性措施的防范对象是不合语义的、不正确的数据,安全性措施的防范对象是非法用户和非法操作。
DBMS常使用触发器来实施复杂的完整性定义、检查和违约处理。安全性控制中也可以使用触发器来实现安全控制,例如入侵检测、审计操作等。
3. 什么是数据库的完整性约束?
答:完整性约束是指数据库中的数据必须满足的语义约束。
4. RDBMS的完整性控制机制应具有哪三个方面的功能?
答:
- 定义功能:提供定义完整性约束的机制。
- 检查功能:检查用户发出的操作请求是否违背了完整性约束。
- 违约处理功能:如果发现用户的操作请求违背了完整性约束,则采取一定的动作来保证数据的完整性。
5. RDBMS在实现参照完整性时需要考虑哪些方面?
答:可能破坏参照完整性的4种情况以及可以采取的违约处理策略如下表所示:
|
被参照表(例如 Student) |
参照表(例如 SC) |
违约处理 |
|
可能破坏参照完整性 |
插入元组 |
拒绝。 |
|
可能破坏参照完整性 |
修改外码值 |
拒绝。 |
|
删除元组 |
可能破坏参照完整性 |
拒绝/级联删除/设置为空值 |
|
修改主码值 |
可能破坏参照完整性 |
拒绝/级联修改/设置为空值 |
6. 假设有下面两个关系模式:职工(职工号,姓名,年龄,职务,工资,部门号),其中职工号为主码;部门(部门号,名称,经理名,电话),其中部门号为主码。用SQL定义这两个关系模式,要求在模式中完成以下完整性约束的定义:①定义每个模式的主码。②定义参照完整性。③定义职工年龄不得超过65岁。
答:
CREATE TABLE DEPT
(Deptno NUMBER(2) PRIMARY KEY, /*定义主码*/
Deptname VARCHAR(10),
Manager VARCHAR(10),
PhoneNumber CHAR(12)
);
CREATE TABLE EMP
(Empno NUMBER(4) PRIMARY KEY, /*定义主码*/
Ename VARCHAR(10),
Age NUMBER(2),
Job VARCHAR(9),
Sal NUMBER(7,2),
Deptno NUMBER(2),
CONSTRAINT CI CHECK(Age <= 65),
CONSTRAINT FK_DEPTNO FOREIGN KEY (Deptno) REFERENCES DEPT(Deptno)
);
7. 在关系系统中,当操作违反实体完整性、参照完整性和用户定义的完整性约束条件时,一般是如何分别进行处理的?
答:对于违反实体完整性和用户定义的完整性的操作,一般都采用拒绝执行的方式进行处理;而对于违反参照完整性的操作,并不都是简单地拒绝执行,有时要根据应用语义执行一些附加的操作,以保证数据库的正确性。
8. 某单位计划举行一个小型联谊会,关系Male记录注册的男宾信息,关系Female记录注册的女宾信息。建立一个断言,将来宾的人数限制在50人以内(提示:先创建关系Male和关系Female)。
答:
/*创建关系Male*/
CREATE TABLE Male
(SerialNumber SmallInt PRIMARY KEY, /*注册的序列号*/
Name CHAR(8),
Age SMALLINT,
Occupation CHAR(20)
);
/*创建关系Female*/
CREATE TABLE Female
(SerialNumber SMALLINT PRIMARY KEY, /*注册的序列号*/
Name CHAR(8),
Age SMALLINT,
Occupation CHAR(20)
);
/*创建断言PARTY*/
CREATE ASSERTION Party CHECK((SELECT COUNT(*) FROM Male) + (SELECT COUNT(*) FROM Female) <= 50);
补充习题
1. 选择题
① 定义关系的主码意味着主码属性()。
A.必须唯一
B.不能为空
C.唯一且部分主码属性不为空
D.唯一且所有主码属性不为空
② 关于语句 CREATE TABLE R (no INT, sum INT CHECK ((sum>0)) )和 CREATE TABLE R (no INT, sum INT, CHECK ((sum>0)) ),以下说法不正确的是()。
A.两条语句都是合法的
B.前者定义了属性上的约束条件,后者定义了元组上的约束条件
C.两条语句的约束效果不一样
D.当sum属性改变时检查,上述两种CHECK约束都要被检查
③ 下列说法正确的是()。
A.使用ALTER TABLE ADD CONSTRAINT可以增加基于元组的约束
B.如果属性A上定义了UNIQUE约束,则A不可以为空
C.如果属性A上定义了外码约束,则A不可以为空
D.不能使用ALTER TABLE ADD CONSTRAINT增加主码约束
2. 填空题
① 在CREATE TABLE时,用户定义的完整性可以通过______、______、______等子句实现。
② 关系 R 的属性 A 参照引用关系 T 的属性 A ,T 的某条元组对应的 A 属性值在 R 中出现,当要删除 T 的这条元组时,系统可以采用的策略包括______、______、______。
③ 定义数据库完整性一般是由SQL的______语句实现的。
3. 综合题
① 考虑下面的关系模式:
研究人员(人员编号,姓名,年龄,职称)
项目(项目编号,名称,负责人编号,类别)
参与(项目编号,人员编号,工作时间)/一个研究人员可以参加多个项目,一个项目有多个研究人员参加,工作时间给出了某研究人员参加某项目的月数/
写出下面的完整性约束:
a.定义三个关系中的主码、外码、参照完整性。
b.每个研究人员的年龄不能超过35岁。
c.每个研究人员的职称只能是"讲师""副教授"或"教授"。
d.一个研究人员参加各种项目的总工作时间不能超过12个月。
e.每个项目至少有5位研究人员。
f.每个研究人员参加的项目数不能超过3个。
② 考虑题1中的关系模式,使用ALTER TABLE ADD CONSTRAINT声明如下完整性约束:
a.在关系模式"项目"中,负责人编号参照关系模式"研究人员"的"人员编号"属性,当对"研究人员"更新时,若违反约束则拒绝操作。
b.同a,但当违反约束时,将负责人编号置为NULL。
c.同a,但当违反约束时,将"项目"中相应元组的负责人编号也进行修改。
d.工作时间在1到12个月之间。
e.项目名称不能为空。
③ 使用CHECK短语写出题1中关系模式"项目"的参照完整性约束。
④ 考虑下面的关系模式:
Teacher (Tno, Tname, Tage, Tsex)
Department (Dno, Dname, Tno) /Tno为系主任的职工号/
Work (Tno, Dno, Year, Salary) /某系某职工在某一年的工资/
将下列要求写成触发器:
a.插入新教师时,同时将此教师信息插入Work关系,不确定的属性赋以NULL值。
b.更改教师年龄时,如果新年龄比旧年龄低,则用旧年龄代替。
5.4 补充习题答案
1. 选择题答案
① D
② C
③ A
2. 填空题答案
① NOT NULL、UNIQUE、CHECK
② 拒绝执行、级联删除、设为空值
③ DDL
3. 综合题答案
①
CREATE TABLE研究人员
(人员编号INT PRIMARY KEY,
姓名CHAR(8),
年龄SMALLINT CHECK(年龄<=35),
职称CHAR(8) CHECK(职称IN('讲师','副教授','教授'))
);
CREATE TABLE项目
(项目编号 INT PRIMARY KEY,
名称 CHAR(20),
负责人编号INT,
类别 CHAR(8),
FOREIGN KEY(负责人编号)REFERENCES研究人员(人员编号)
);
CREATE TABLE参与
(项目编号INT,
人员编号INT,
工作时间SMALLINT,
PRIMARY KEY(项目编号,人员编号),
FOREIGN KEY(项目编号) REFERENCES项目(项目编号),
FOREIGN KEY(人员编号)REFERENCES研究人员(人员编号)
);
/*创建断言:工作时间限制*/
CREATE ASSERTION工作时间限制
CHECK (12>=ALL(SELECT SUM(工作时间)FROM参与GROUP BY人员编号));
/*创建断言项目参加人数限制*/
CREATE ASSERTION项目参加人数
CHECK(5<=ALL(SELECT COUNT(人员编号)FROM参与GROUP BY项目编号));
/*创建断言研究员参加项目数限制*/
CREATE ASSERTION研究员参加项目
CHECK(3 >=ALL(SELECT COUNT(项目编号) FROM参与 GROUP BY人员编号));
②
a.
ALTER TABLE项目ADD CONSTRAINT CI FOREIGN KEY (负责人编号)REFERENCES研究人员(人员编号)ON UPDATE NO ACTION;
b.
ALTER TABLE项目 ADD CONSTRAINT C2 FOREIGN KEY (负责人编号)REFERENCES 研究人员 (人员编号)ON UPDATE SET NULL;
c.
ALTER TABLE 项目 ADD CONSTRAINT C3 FOREIGN KEY (负责人编号)REFERENCES研究人员 (人员编号)ON UPDATE CASCADE;
d.
ALTER TABLE参与ADD CONSTRAINT C4 CHECK(工作时间>=1 and工作时间<=12);
e.
ALTER TABLE 项目 ADD CONSTRAINT CS CHECK (名称IS NOT NULL);
③
CHECK(负责人编号IN(SELECT人员编号FROM研究人员));
④
a.
CREATE TRIGGER New_Teacher
AFTER INSERT ON Teacher
FOR EACH ROW AS
BEGIN
/*插入新教师后将此教师信息插入Work,不确定的属性赋以NULL*/
INSERT INTO Work VALUES (new.tno, NULL, NULL, NULL);
END;
b.
CREATE TRIGGER UpdateAge
AFTER UPDATE OF Tage ON Teacher
FOR EACH ROW AS
BEGIN
IF(new.Tage<old.Tage)/*更新教师年龄时,如果新年龄比旧年龄小*/
UPDATE Teacher SET Tage = old.Tage WHERE Tno = new.Tno; /*则用旧年龄代替*/
END;
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)