知识卡片
实体完整性/参照完整性/用户自定义完整性三层约束体系
内容
关系模型的完整性约束不是单一规则,而是按约束对象的不同分成三个层次, 前两层是所有关系数据库都必须支持的强制约束,第三层才是可选的业务语义 约束。实体完整性约束的是单张表内部:任何元组的主码取值都不能为空、不能 与其他元组重复——本质是保证”每个元组能被唯一定位”这个关系模型的基本 前提,主码取空值或重复都意味着这条记录失去了可靠的身份标识。参照完整性 约束的是表与表之间的关系:如果一张表(参照关系)的某个属性集(外码) 引用另一张表(被参照关系)的主码,那么外码的每个取值要么等于被参照表 里某条记录的主码,要么为空——这防止了”引用了一个根本不存在的对象”这种 悬空引用,例如教师表里的所属学院字段不能指向一个学院表里根本不存在的 学院。用户自定义完整性则是前两者都无法覆盖的、具体业务场景才有的语义 约束(如成绩必须在0到100之间),它不是关系模型强制要求的,而是留给 具体应用按需定义的机制。三者的关系是:实体完整性保证”我是谁”不会出错, 参照完整性保证”我引用的东西真实存在”,用户自定义完整性保证”我的取值 符合业务规则”。
结构图:
flowchart TD
A[关系模型完整性约束] --> B[实体完整性<br/>单表内: 主码不为空且不重复]
A --> C[参照完整性<br/>表之间: 外码取值必须等于被参照表主码或为空]
A --> D[用户自定义完整性<br/>可选: 具体业务语义约束,如成绩0-100]
B -->|强制| E[保证每个元组可被唯一定位]
C -->|强制| F[防止引用不存在的对象]
D -->|可选| G[满足具体应用的语义要求]
参考来源
- 位置:《数据库原理(微课版)》第2章《关系数据库》2.2.1-2.2.3节
(源文件:_epub-src/index_split_001.html与index_split_002.html)
- 结论依据:原文定义实体完整性为"若属性集A是关系R的主码,则对每一个
元组,其属性集A中的每个属性值不能出现空值,且这些属性取值的组合不能
有重复值",参照完整性为"若属性集F是基本关系R的外码……R中每个元组
在F上的值必须等于S中某个元组的候选码的值",并说明"实体完整性和参照
完整性是必须满足的完整性约束;用户自定义完整性是应用领域需要遵循的
约束",因此可以推出三层约束体系及其强制性差异。
- 原始内容:实体完整性和参照完整性是必须满足的完整性约束;用户自定义
完整性是应用领域需要遵循的约束,体现的是具体领域中的语义约束。