关系完整性

31°C 04-01-2025 notbyai
最近更新于:2025-01-04 17:16:13

1. 实体完整性(Entity Integrity)

概念

实体完整性约束是用来保证表中的每条记录是唯一的,防止记录的标识混乱或数据冲突。主要通过主键(Primary Key)来实现,主键字段具有以下两个特点:

  1. 唯一性:主键字段的值在表中必须唯一,不能重复。
  2. 非空性:主键字段不能为 NULL,因为 NULL 表示“未知”,会导致标识混淆。

规则

  • 每个表必须有一个主键字段或组合字段,作为唯一标识。
  • 一个表中主键只能有一个,且不能包含 NULL 值。

实现方式

  • 在表设计时声明主键。
  • 使用数据库中的约束机制(如 PRIMARY KEY 约束)。

举例

学生表(Student):

学号(Student_ID)姓名(Name)年龄(Age)
001张三20
002李四21
NULL王五22⬅️ 错误:主键为空,违反实体完整性
001赵六23⬅️ 错误:主键重复,违反实体完整性

解决方案:

  • 在定义表时,声明 Student_ID 为主键:
CREATE TABLE Student (
    Student_ID INT PRIMARY KEY,
    Name VARCHAR(50),
    Age INT
);
  • 数据库会自动检查主键字段的唯一性和非空性。

2. 参照完整性(Referential Integrity)

概念

参照完整性约束是用来保证表与表之间的逻辑关系的正确性,特别是通过外键(Foreign Key)来确保数据引用的合法性。

  • 外键:用于建立两个表之间的联系,是一个表中引用另一个表主键的字段。

规则

  • 外键值必须要么是 NULL,要么匹配被引用表中的主键值。
  • 外键值不能引用一个不存在的主键值,否则会导致“孤立记录”或“断开关系”。

实现方式

  • 在表设计时,定义外键约束(FOREIGN KEY)。
  • 数据库会自动检查外键值是否符合规则。

举例

表结构:

  • 学生表(Student):
学号(Student_ID)姓名(Name)班级编号(Class_ID)
001张三101
002李四102
003王五104⬅️错误:班级编号不存在,违反参照完整性
  • 班级表(Class):
班级编号(Class_ID)班级名称(Class_Name)
101一年级一班
102一年级二班
103一年级三班
  • 分析:
    • 学生表中的外键 Class_ID 应该引用班级表中的主键 Class_ID
    • 当学生表中出现 Class_ID = 104 时,班级表中没有对应的记录,会违反参照完整性。
  • 解决方案
    • 定义外键约束:
CREATE TABLE Student (
    Student_ID INT PRIMARY KEY,
    Name VARCHAR(50),
    Class_ID INT,
    FOREIGN KEY (Class_ID) REFERENCES Class(Class_ID)
);
  • 数据库会自动阻止插入或更新无效的外键值。
  • 外键约束的操作选项
    • ON DELETE CASCADE:当删除班级表中的某条记录时,自动删除学生表中引用这条记录的所有行。
    • ON UPDATE CASCADE:当更新班级编号时,自动更新学生表中对应的外键值。

3. 用户定义完整性(User-Defined Integrity)

概念

用户定义完整性是根据业务需求自定义的一些规则,用来保证数据的合法性和逻辑正确性。

规则

  • 可以限制字段的值范围、格式,或定义特定的逻辑条件。
  • 主要通过检查约束(CHECK Constraint)或触发器(Trigger)来实现。

实现方式

  • 在表设计时,定义检查约束或业务逻辑。
  • 编写触发器来验证更复杂的规则。

举例

业务规则:

  • 年龄字段必须在 0 到 150 之间。
  • 性别字段只能是“男”或“女”。
  • 成绩字段不能为负数。

表结构:

学生表(Student):

学号(Student_ID)姓名(Name)年龄(Age)性别(Gender)成绩(Score)
001张三2095
002李四15189⬅️ 错误:年龄超出范围
003王五22未知-5⬅️ 错误:性别非法值、成绩为负

解决方案:

  • 定义检查约束:
CREATE TABLE Student (
    Student_ID INT PRIMARY KEY,
    Name VARCHAR(50),
    Age INT CHECK (Age BETWEEN 0 AND 150),
    Gender CHAR(1) CHECK (Gender IN ('男', '女')),
    Score INT CHECK (Score >= 0)
);
  • 数据库会自动验证插入或更新的数据是否符合规则。

触发器(复杂规则):

  • 如果某些业务规则较复杂(如:同一班级的学生年龄不能超过10岁),可以使用触发器:
CREATE TRIGGER Check_Age_Rule
BEFORE INSERT OR UPDATE ON Student
FOR EACH ROW
BEGIN
    IF NEW.Age > 150 THEN
        SIGNAL SQLSTATE '45000'
        SET MESSAGE_TEXT = '年龄不能超过 150 岁';
    END IF;
END;

对比

类型作用规则示例实现方式
实体完整性确保每条记录唯一可识别主键必须唯一,且不能为空主键值不能重复或为 NULLPRIMARY KEY
参照完整性确保表与表之间的引用关系正确外键值要么为 NULL,要么引用目标表的主键外键引用不存在的主键值FOREIGN KEY + 操作选项
用户定义完整性确保数据符合具体业务规则数据范围、格式或逻辑合法性年龄范围 [0,150],性别为“男”或“女”CHECK,或使用触发器

总结

关系完整性是指在关系数据库中,为保证数据的正确性和一致性而设置的一系列约束条件,包括实体完整性、参照完整性和用户定义完整性三部分:

  1. 实体完整性:要求每个关系表的主键字段必须唯一且不能为空,以确保表中的每条记录都能被唯一标识。
  2. 参照完整性:要求外键的值要么为空,要么引用另一个表中有效的主键值,以保证表与表之间的引用关系是正确的。
  3. 用户定义完整性:根据具体业务需求,定义字段值的范围、格式或逻辑规则,确保数据的合法性和逻辑一致性。

关系完整性通过这些约束机制,防止数据异常、重复或丢失,维护数据库系统的逻辑一致性。


评论留言

欢迎您,!您可以在这里畅言您的的观点与见解!

0 条评论