在第四章中,我们学习了如何构筑数据库的安全防线,防止非法入侵和破坏。然而,安全只是保障数据可用性的第一步。第五章"数据库完整性"则聚焦于一个更本质的问题:如何确保数据库中存储的数据本身就是正确的、符合现实世界语义的?
如果说安全性防范的是"坏人",那么完整性防范的就是"坏数据"。本章系统地介绍了从基础规则到高级机制的多层次完整性控制策略,为数据的真实性保驾护航。
一、 完整性 vs. 安全性:两个不同维度的守护
首先需要明确,数据完整性 与数据安全性是两个紧密相关但目标迥异的概念:
- 完整性 :关注数据的正确性 与相容性 。它确保数据符合现实世界的业务规则和逻辑约束,例如"学生的年龄必须在14-29岁之间"、"学号必须唯一"。其防范对象是不合语义的、不正确的数据。
- 安全性 :关注数据的保密性 与防破坏性 。它保护数据库免受恶意攻击和非法访问,其防范对象是非法用户和非法操作。
二者相辅相成,共同构成了数据库可靠性的基石。
二、 三大支柱:实体、参照与用户定义完整性
关系模型通过三类完整性约束,构建了完整性的核心框架。
-
实体完整性(Entity Integrity):确保每个实体都能被唯一标识。
- 规则:主码(Primary Key)属性不能取空值(NULL),且必须唯一。
- 实现 :通过
PRIMARY KEY约束定义。 - 检查 :DBMS在
INSERT或UPDATE主码时自动进行唯一性和非空检查。为提高效率,通常会在主码上自动建立B+树索引,避免全表扫描。
-
参照完整性(Referential Integrity):维护表与表之间的引用一致性。
- 规则:外码(Foreign Key)要么为空,要么必须等于被参照表(父表)中某个元组的主码值。
- 实现 :通过
FOREIGN KEY ... REFERENCES ...约束定义。 - 违约处理 :当更新或删除操作可能破坏参照完整性时,DBMS提供多种策略:
- 拒绝(NO ACTION):默认策略,直接阻止操作。
- 级联(CASCADE):自动执行关联操作(如删除学生时,级联删除其所有选课记录)。
- 置空(SET NULL):将外码字段设为空值(需允许为空)。
-
用户定义的完整性(User-defined Integrity):满足特定应用的业务规则。
- 规则:针对具体应用场景的特殊约束,如"性别只能是'男'或'女'"。
- 实现 :通过列级或元组级的约束条件实现:
- 列级约束 :
NOT NULL(非空)、UNIQUE(唯一)、CHECK (条件)(检查)。 - 元组级约束 :
CHECK子句可以跨多个属性设置复杂的逻辑,例如"当性别为'男'时,姓名不能以'Ms.'开头"。
- 列级约束 :
三、 增强与抽象:命名、域、断言与触发器
为了提供更灵活、更强大的完整性控制能力,SQL标准还引入了更高层次的机制。
-
完整性约束命名子句(CONSTRAINT):
- 允许为每一个约束(主键、外键、CHECK等)指定一个有意义的名字(如
CONSTRAINT C1 CHECK (Sage < 30))。 - 优势 :极大地简化了后续对约束的修改和删除操作(
ALTER TABLE ... DROP CONSTRAINT C1)。
- 允许为每一个约束(主键、外键、CHECK等)指定一个有意义的名字(如
-
域(Domain)中的完整性限制:
- 通过
CREATE DOMAIN语句,可以创建一个带有特定约束的自定义数据类型。 - 优势 :实现了约束的复用 和集中管理 。例如,定义一个
GenderDomain域后,所有表示性别的列都可以使用这个域,当需要修改性别取值范围时,只需修改域的定义即可。
- 通过
-
断言(Assertion):表达全局性、跨表的复杂约束。
- 使用
CREATE ASSERTION语句,可以定义涉及多个表或包含聚合函数(如COUNT,SUM)的复杂规则。 - 示例:"限制每一门课程最多60名学生选修"。
- 特点:功能强大,但检查开销大,应谨慎使用。
- 使用
-
触发器(Trigger):事件驱动的主动完整性控制。
- 触发器是一段由特定事件(
INSERT/UPDATE/DELETE)激活的、存储在数据库服务器中的过程代码。 - 核心要素 :
BEFORE/AFTER(时机)、FOR EACH ROW/STATEMENT(粒度)、WHEN(条件)、动作体。 - 应用场景 :
- 复杂约束:实现断言无法完成的、需要过程化逻辑的规则。
- 审计日志:自动记录数据变更历史。
- 数据同步:在一张表变更时,自动更新其他相关表。
- 数据修正:如"教授工资低于4000时自动设为4000"。
- 优势:提供了比静态约束更精细、更动态的控制能力。
- 触发器是一段由特定事件(
结语:从被动检查到主动守护
第五章的内容展示了数据库完整性控制从被动检查 (如实体、参照完整性)到主动干预(如触发器)的演进。通过合理运用这些机制,我们可以将业务规则内嵌到数据库层面,确保无论应用程序如何变化,数据的核心逻辑和真实性都能得到最可靠的保障。
掌握了完整性控制,我们就拥有了确保数据质量的强大武器。接下来,我们将进入数据库设计的核心理论------关系数据理论,探究如何从根本上消除数据冗余和更新异常,设计出结构优良的数据库模式。敬请期待!