数据库——第五章作业
解释外键、数据完整性和级联更新。
- 外键:已知 \(X\) 是关系 \(R\) 的主键,\(Y\) 是关系 \(S\) 的属性(或属性组)但非 \(S\) 的主键。如果 \(Y\) 与 \(X\) 相对应,则称 \(Y\) 是关系 \(S\) 的外键;
- 数据完整性:数据的正确性和相容性。
- 数据正确性:数据必须符合实际应用;
- 数据相容性:数据在不同的关系中必须符合相应的逻辑关系。
- 级联更新:对于违约操作,不是简单的拒绝,而是根据具体情况,把违约更新转换为非违约更新,然后接受更新。
简述数据完整性的内容及其约束规则。
- 数据完整性的内容:实体完整性、参照完整性和用户定义完整性。
- 约束规则如下:
- 实体完整性规则:主属性 \(A\) 的取值不能为空值 \(\tt{}NULL\) 。
- 参照完整性规则:若 \(X\) 是关系 \(R\) 的主键,\(Y\) 是关系 \(S\) 的外键,且 \(Y\) 与 \(X\) 相对应,则 \(Y\) 的取值:要么为空值、要么为 \(X\) 。
\(\iff\) 若 \(Y\) 是 \(S\) 的外键,且是 \(R\) 的主键,则 \(Y\) 的取值:要么为空值、要么为 \(R\) 的主键的值。 - 用户定义完整性规则:用户根据系统需求自己定义的约束条件。
简述完整性控制机制的基本功能。
- 定义功能、检查功能和违约处理
- 定义功能:提供完善的定义数据完整性约束的功能,同时提供相应的接口。
- 检查功能:对于插入、修改和删除等更新操作,提供检查完整性约束违约的功能。
\(\iff\) 检查用户操作是否违背了完整性约束条件,对于非违约操作,则执行相应的操作;对于违约操作则执行相应的违约处理。 - 违约处理:对于破坏数据完整性的违约操作,提供相应的违约处理能力。
- 数据完整性约束的对象。
简述完整性的违约处理方法。
- 拒绝更新:拒绝执行更新操作;
- 置空:将违约操作所涉及的数据置为空值。
- 级联更新
创建关系模式,并完成完整性约束
create table C(
CNo char(1000) primary key,
CName char(1000) not null,
CAddr char(1000) not null
);
create table P(
PNo char(1000) primary key,
PName char(1000) not null,
Price int check(Price >= 20 and Price < 60),
PSupp char(1000) not null
);
create table R(
RNo char(1000) primary key,
CNo char(1000),
PNo char(1000),
RDate date not null,
Quant int not null
);
-- 定义参照完整性
alter table R(
foreign key(CNo) references C(Cno)
on delete cascade
on update cascade,
foreign key(PNo) references P(Pno)
on delete cascade
on update cascade
);
填空题
- 均不能。
- 第一个新元组:主键重复。
- 第二个新元组:\(\tt{}T11\) 作为 \(P\) 表的外键属性值,未在主键表的主键属性值中出现过。
- 第三个新元组:颜色未满足用户自定义约束。
- 后者,\(P\) 表中未使用。
- 前者,由于 \(P\) 表中出现了 \(\tt{}T20\) ,改动后者会导致外键表违反参照约束。
- \(16\) 。
- \(4\) 。
简答题1
- 雇员号。
- 部门号。
- 不是,可能出现重名。
- 表 \(\tt{}3.3\) 中第四行更改为
101 张三 06
。 - 表 \(\tt{}3.3\) 中第三行更改为
056 马林 03
。
简答题2
-
代码见下。
create table R( A int primary key, B char(2), C char(2) ); create table S( D char(2), E char(2), A int, foreign key(A) references R(A) );
-
前者不能删,因为 \(S\) 表 \(A\) 中出现过 \(2\) ,而 \(A\) 作为 \(S\) 的外键,若删除,则会破坏参照完整性;对应的,后者可删。
若上一题考虑了外键的联级更新(如下),则两者均可删,因为主键表的更新会实时更新至外键表。create table R( A int primary key, B char(2), C char(2) ); create table S( D char(2), E char(2), A int, foreign key(A) references R(A) on delete cascade on update cascade );