知识卡片
参照完整性违反时的五种处理策略及连锁影响
内容
[[实体完整性参照完整性用户自定义完整性三层约束体系]]只回答了”外码取值 必须能在被参照表里找到对应记录”这个静态条件,但没有回答一个更实际的 问题:如果被参照的那条记录本身被删除或修改了,所有引用它的记录该怎么 办?这正是参照完整性区别于实体完整性的地方——实体完整性违反时只有 “拒绝执行”一种反应,参照完整性违反时却有五种可选策略,本质上是在 “保护数据一致性的严格程度”和”允许操作继续执行”之间做不同取舍。 RESTRICT(与NO ACTION等效)是最保守的策略:只要还有记录在引用,删除/ 修改操作直接被拒绝,必须先手动清理引用方;CASCADE是最激进的策略: 删除/修改被参照记录时,所有引用它的记录跟着被删除/修改,一次操作可能 连锁触发多张表的变化;SET NULL是折中策略:引用方记录保留,但外码字段 被置空,代价是这条记录从此失去了原来的关联信息;SET DEFAULT与SET NULL 逻辑相同,只是置为预定义的默认值而非空值。选择哪种策略取决于业务语义: 删除一个学院时,如果学院下还有学生,直接CASCADE删除所有学生记录几乎 肯定是错误的(应该用RESTRICT强制先处理学生),但删除一门选修课的 具体开课批次时,让相关的选课记录级联清除(CASCADE)往往才是符合预期 的——策略选错的后果不是报错,而是数据被静默地错误删除或错误保留。
结构图:
flowchart TD
A[被参照记录被删除或修改] --> B{参照表中是否有记录引用它}
B -->|无引用| C[直接执行,无影响]
B -->|有引用| D{策略选择}
D -->|RESTRICT/NO ACTION| E[拒绝本次删除/修改操作]
D -->|CASCADE| F[引用方记录跟着被删除/修改]
D -->|SET NULL| G[引用方外码字段置空,记录保留]
D -->|SET DEFAULT| H[引用方外码字段设为默认值,记录保留]
参考来源
- 位置:《数据库原理(微课版)》第4章《数据库完整性》4.3.1-4.3.2节
(源文件:_epub-src/index_split_003.html)
- 结论依据:原文明确"RESTRICT:如果待删除或修改的记录在参照表中被
引用,不做删除或修改操作,返回错误信息……CASCADE:如果删除或修改
被参照表的记录,则参照表中引用该记录的记录也被删除或修改……SET
NULL:……参照表中引用该记录的记录中的对应字段设置为空值",并通过
例4-5演示了ON DELETE CASCADE导致删除student表记录时连锁删除takes
表对应记录的具体过程,因此可以推出五种策略在数据一致性严格程度上的
差异及连锁影响。
- 原始内容:RESTRICT:如果待删除或修改的记录在参照表中被引用,不做
删除或修改操作,返回错误信息……CASCADE:如果删除或修改被参照表的
记录,则参照表中引用该记录的记录也被删除或修改。