5.2 参照完整性

5.2.1 参照完整性定义
5.2.2 参照完整性检查和违约处理

若属性(或属性组)F是基本关系R的外码它与基本关系S的主码 K s K_s Ks相对对应(基本关系R和S不一定是不同的关系),则对于R中的每个元组在F上的值必须为:
    ◾ 或者取空值(F的每个属性值均为空值)
    ◾ 或者等于S中某个元组的主码值
例:学生关系的“专业号”是外码,它参照专业关系的主码“专业号”

学生关系---------专业号-------->专业关系

学生关系中的每个元组的“专业号”属性只能取两类值:
(1)空值,表示该学生尚未确定专业
(2)非空值,这时该值必须是专业关系中某个元组的“专业号”值,表示该学生不能属于一个不存在的专业

♥  关系模型的参照完整性定义
    ◾ 在create table中用foreign key短语定义哪些列为外码
    ◾ 用peferences短语指明这些外码参照哪些表的主码
例:Student表的Sdept属性是外码,参照DEPT表的主码Deptno

create table Student
(Sno char(9) primary key,		-- 列级完整性约束条件,Sno是主码
 Sname char(20) unique,
 Ssex char(2),
 Sage smallint,
 Sdept char(20) foreign key peferences DEPY(Drptno)	-- 在列级定义参照完整性
)
create table Student
(Sno char(9) primary key,		-- 列级完整性约束条件,Sno是主码
 Sname char(20) unique,
 Ssex char(2),
 Sage smallint,
 Sdept char(20)
 foreign key(Sdept) peferences DEPY(Drptno)	-- 在表级定义参照完整性
)

例:在SC中(Sno, Cno)是主码,Sno, Cno分别参照Student表的主码和Course表的主码

create table SC
(Sno char(9) not unll,		
 Cno char(4) not null,
 Grade smallint,
 primary key(Sno, Cno),		-- 在表级定义实体完整性
 foreign key(Sno) peferences Student(Sno)	-- 在表级定义参照完整性
 foreign key(Cno) peferences Course(Cno)	-- 在表级定义参照完整性
)

5.2.1 参照完整性定义
5.2.2 参照完整性检查和违约处理

♥  参照完整性检查和违约处理

DBMS什么时候要进行参照完整性的检查?——有可能破坏参照完整性约束的时候
♥  一个参照完整性将两个表中的相应元组联系起来
♥  对被参照表和参照表进行增删改操作时有可能破坏参照完整性,必须进行检查
♥  例:表SC和Student有四种可能破坏参照完整性的情况

  1. SC表中增加一个元组,该元组的Sno属性的值在Student表中找不到一个元组,其Sno属性的值与之相等
  2. 修改SC表中的一个元组,修改后该元组的Sno属性的值在Student表中找不到一个元组,其Sno属性的值与之相等
  3. 从Student表中删除一个元组,造成SC表中某些元组的Sno属性的值在表Student中找不到一个元组,其Sno属性的值与之相等
  4. 修改Student表中一个元组的Sno属性,造成SC表中某些元组的Sno属性的值在表Student中找不到一个元组,其Sno属性的值与之相等
被参照表(如Student表)参照表(如SC)违约处理
插入元组拒绝
修改外码值拒绝
删除元组拒绝/级连删除/设为空值
修改主码值拒绝/级连删除/设为空值

♥  参照完整性违约处理
(1)拒绝(NO ACTION)执行
        ● 不允许该操作执行。该策略一般设置为默认策略
(2)级联(CASCADE)操作
        ● 当删除或修改被参照表(Student)的一个元组造成了与参照表(SC)的不一致,则删除或修改参照表中所有造成不一致的元组
(3)设置为空值(SET-NULL)
        ● 当删除或修改被参照表的一个元组时造成了不一致,则将参照表中的所有造成不一致的元组的对应属性设置为空值

[例 5.4] 显式说明参照完整性的违约处理示例

create table SC
(Sno char(9) not null,
 Cno char(4) not null,
 Grade smallint,
 primary key(Sno, Cno),
 foreign key(Sno) peferences Student(Sno)
    on delete CASCADE				-- 级联删除SC表中相应的元组
    on update CASCADE				-- 级连更新SC表中相应的元组
 foreign key(Cno) peferences Course(Cno)
    on delete NO ACTION				-- 当删除course表中的元组造成了与SC表中不一致时拒绝删除
    on update CASCADE				-- 当更新course表中的Cno时,级联更新SC表中相应的元组
)

♥  参照完整性的定义方法
    ◾ create table … foreign key … peference
♥  参照完整性的检查时机
    ◾ 对被参照表和参照表进行增删改操作时
♥  参照完整性的违约处理
    ◾ 拒绝执行
    ◾ 级联操作
    ◾ 设置为空值

上一篇:5.1 数据库完整性
目    录:《数据库系统概论》
下一篇:5.3 用户定义的完整性

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值