知识卡片

实体完整性与参照完整性及NULL的本质

普通读书笔记卡

内容

关系模型的原始定义包含两条”通用”完整性约束,之所以称为通用,是因为它们适用于所有 数据库、不需要针对具体业务单独声明:实体完整性规则要求主键属性不允许为NULL——理由 是如果连主键(唯一标识这个”实体”的属性)都未知,我们甚至无法确定自己在谈论哪一个 实体;参照完整性规则要求不能存在任何不匹配的外键取值,这条规则直接表达了外键的 语义,本质是”如果B引用了A,那么A必须存在”。理解这两条规则的前提是准确理解NULL到底 是什么:NULL不是一个值,而是一个表示”值未知”的记号或标记——比如不知道某员工的工资, 就不能给这一栏填入任何实际数值(因为根据定义我们不知道该填什么),只能把这个位置 标记为NULL,这个位置本质上”什么都没包含”,而不是包含着某个叫作NULL的特殊值。书中 特别指出作者本人的立场是完全反对NULL这个概念在关系模型中的存在(认为”NULL在关系 模型中没有位置”),这与Codd原始设计的立场相反,但为了解释实体完整性规则,作者暂时 搁置这个分歧,把NULL相关的深入讨论留到后面章节。

参考来源

- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第1章"做好准备"1.4.2节 "完整性特征"(源文件:OEBPS/text00010.html) - 结论依据:原文明确"实体完整性规则:主键属性不允许null……参照完整性规则:不能 存在任何不匹配的外键取值……此规则实际上是说:如果B参照A,则A必须存在""本质上, null是表示'值未知'(value unknown)的'记号'(mark)。重要的是,它本身不是值; 再说一遍,它是一个记号,或标记"。 - 原始内容:实体完整性规则(The entity integrity rule):主键属性不允许null。 参照完整性规则(The referential integrity rule):不能存在任何不匹配的外键 取值……本质上,null是表示"值未知"(value unknown)的"记号"(mark)。重要的是, 它本身不是值;再说一遍,它是一个记号,或标记(flag)。