知识卡片
UNIQUE约束与主码约束是候选码概念的两种落地方式
内容
[[超码候选码主码的层层收窄逻辑]]讲的是理论上一张表可能有多个候选码、 只能选一个当主码,UNIQUE约束正是SQL给”没被选中的那些候选码”提供的 落地机制:一张表只能定义一个主码约束,但可以定义任意多个UNIQUE约束, 让理论上并列的多个候选码都能在数据库层面被强制唯一。两者的实现原理 相似(都靠建唯一性索引来保证不出现重复值),但有一处关键差异体现了 主码和候选码在语义上的分工:主码约束不允许出现空值(因为主码承担着 “标识每一行”的职责,见[[实体完整性参照完整性用户自定义完整性三层约束 体系]]),UNIQUE约束却允许出现空值——这个差异不是实现上的疏漏,而是 呼应了两者角色的不同:主码是”这条记录靠什么被识别”,必须始终存在; UNIQUE约束只是”这个字段如果有值就不能重复”,允许暂时未知或不适用 (比如员工表的身份证号字段设为UNIQUE但允许暂缺,因为身份证号不是 用来识别这条记录的,学号才是)。理解这个区别可以避免一个常见误用: 把本该允许缺失的”业务上唯一”字段错误定义成主码,导致数据缺失该字段 时整条记录都无法插入。
参考来源
- 位置:《数据库原理(微课版)》第4章《数据库完整性》4.4.2节"唯一性约束"
(源文件:_epub-src/index_split_003.html)
- 结论依据:原文明确"UNIQUE约束等价于关系模型中候选码的概念,其与
主码约束的实现原理相似。数据库管理系统为UNIQUE约束、主码约束都
建立唯一性索引,确保不会出现重复值。但主码约束规定主码不允许为空值,
UNIQUE约束允许出现空值……一张表可以定义多个UNIQUE约束,但只能定义
一个主码约束",因此可以推出两者是候选码概念的不同实现方式及其语义
差异。
- 原始内容:UNIQUE约束等价于关系模型中候选码的概念,其与主码约束的
实现原理相似……但主码约束规定主码不允许为空值,UNIQUE约束允许出现
空值。另外……一张表可以定义多个UNIQUE约束,但只能定义一个主码约束。