本文整理了《数据库系统概论(第6版)》第五章“数据库完整性”的课后习题及补充习题答案,旨在为学习者提供清晰的参考,方便课后复习与巩固。

习题解答和解析

1. 什么是数据库的完整性?

答:数据库的完整性是指数据库数据的正确性和相容性。

2. 数据库的完整性概念与数据库的安全性概念有什么区别和联系?

答:数据的完整性和安全性是两个不同的概念,但是二者有一定的联系。
完整性是为了防止数据库中存在不符合语义的数据,防止错误信息的输入和输出,即所谓的垃圾进垃圾出(garbage in garbage out)所造成的无效操作和错误结果。
安全性是保护数据库防止恶意破坏和非法存取。
因此,完整性措施的防范对象是不合语义的、不正确的数据,安全性措施的防范对象是非法用户和非法操作。
DBMS常使用触发器来实施复杂的完整性定义、检查和违约处理。安全性控制中也可以使用触发器来实现安全控制,例如入侵检测、审计操作等。

3. 什么是数据库的完整性约束?

答:完整性约束是指数据库中的数据必须满足的语义约束。

4. RDBMS的完整性控制机制应具有哪三个方面的功能?

答:

  1. 定义功能:提供定义完整性约束的机制。
  2. 检查功能:检查用户发出的操作请求是否违背了完整性约束。
  3. 违约处理功能:如果发现用户的操作请求违背了完整性约束,则采取一定的动作来保证数据的完整性。
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;

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐