-
1 讲稿
-
2 习题
一、参照完整性定义
关系模型的参照完整性在create table中用foreign key短语定义外码,用references短语指明外码参照哪些表的主码。
例:
s(sno,sname,ssex,sage,sdept) 主码sno
c(cno,cname,cpno,ccredit) 主码cno
sc(sno,cno,grade) 主码(sno,cno)
定义sc 中的参照完整性
create table sc
{
sno char(9) not null,
cno char(4) not null,
grade smallint,
primary key(sno,cno),
foreign key(sno) references s(sno),
foreign key(cno) references c(cno)
};
二、参照完整性检查和违约处理
例如,对表SC和Student有四种可能破坏参照完整性的情况 :
nSC表中增加一个元组,该元组的Sno属性的值在表Student中找不到一个元组,其Sno属性的值与之相等。
n修改SC表中的一个元组,修改后该元组的Sno属性的值在表Student中找不到一个元组,其Sno属性的值与之相等。
例如,对表SC和Student有四种可能破坏参照完整性的情况 (续):
n从Student表中删除一个元组,造成SC表中某些元组的Sno属性的值在表Student中找不到一个元组,其Sno属性的值与之相等。
n修改Student表中一个元组的Sno属性,造成SC表中某些元组的Sno属性的值在表Student中找不到一个元组,其Sno属性的值与之相等 。
表5.1 可能破坏参照完整性的情况及违约处理
| 被参照表(例如Student) | 参照表(例如SC) | 违约处理 |
| 可能破坏参照完整性 | 插入元组 | 拒绝 |
| 可能破坏参照完整性 | 修改外码值 | 拒绝 |
| 删除元组 | 可能破坏参照完整性 | 拒绝/级连删除/设置为空值 |
| 修改主码值 | 可能破坏参照完整性 | 拒绝/级连修改/设置为空值 |
三、参照完整性违约处理
(1)拒绝(NO ACTION)执行
l不允许该操作执行。该策略一般设置为默认策略
(2)级联(CASCADE)操作
l当删除或修改被参照表(Student)的一个元组造成了与参照表(SC)的不一致,则删除或
修改参照表中的所有造成不一致的元组
(3)设置为空值(SET-NULL)
l当删除或修改被参照表的一个元组时造成了不一致,则将参照表中的所有造成不一致的元组
的对应属性设置为空值。
例如,有下面2个关系
学生(学号,姓名,性别,专业号,年龄)
专业(专业号,专业名)
l假设专业表中某个元组被删除,专业号为12
l按照设置为空值的策略,就要把学生表中专业号=12的所有元组的专业号设置为空值
l对应语义:某个专业删除了,该专业的所有学生专业未定,等待重新分配专业
(4)对于参照完整性,除了应该定义外码,还应定义外码列是否允许空值
[例5.4] 显式说明参照完整性的违约处理示例
CREATE TABLE SC
( Sno CHAR(9) NOTNULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY(Sno,Cno),
FOREIGN KEY (Sno)REFERENCES Student(Sno)
ON DELETE CASCADE /*级联删除SC表中相应的元组*/
ON UPDATE CASCADE, /*级联更新SC表中相应的元组*/
FOREIGN KEY (Cno) REFERENCES Course(Cno)
ON DELETE NO ACTION
/*当删除course 表中的元组造成了与SC表不一致时拒绝删除*/
ON UPDATE CASCADE
/*当更新course表中的cno时,级联更新SC表中相应的元组*/
);

