1. 实体完整性(Entity Integrity)
概念
实体完整性约束是用来保证表中的每条记录是唯一的,防止记录的标识混乱或数据冲突。主要通过主键(Primary Key)来实现,主键字段具有以下两个特点:
- 唯一性:主键字段的值在表中必须唯一,不能重复。
- 非空性:主键字段不能为 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 | 张三 | 20 | 男 | 95 | |
002 | 李四 | 151 | 女 | 89 | ⬅️ 错误:年龄超出范围 |
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;
对比
类型 | 作用 | 规则 | 示例 | 实现方式 |
---|---|---|---|---|
实体完整性 | 确保每条记录唯一可识别 | 主键必须唯一,且不能为空 | 主键值不能重复或为 NULL | PRIMARY KEY |
参照完整性 | 确保表与表之间的引用关系正确 | 外键值要么为 NULL,要么引用目标表的主键 | 外键引用不存在的主键值 | FOREIGN KEY + 操作选项 |
用户定义完整性 | 确保数据符合具体业务规则 | 数据范围、格式或逻辑合法性 | 年龄范围 [0,150],性别为“男”或“女” | CHECK ,或使用触发器 |
总结
关系完整性是指在关系数据库中,为保证数据的正确性和一致性而设置的一系列约束条件,包括实体完整性、参照完整性和用户定义完整性三部分:
- 实体完整性:要求每个关系表的主键字段必须唯一且不能为空,以确保表中的每条记录都能被唯一标识。
- 参照完整性:要求外键的值要么为空,要么引用另一个表中有效的主键值,以保证表与表之间的引用关系是正确的。
- 用户定义完整性:根据具体业务需求,定义字段值的范围、格式或逻辑规则,确保数据的合法性和逻辑一致性。
关系完整性通过这些约束机制,防止数据异常、重复或丢失,维护数据库系统的逻辑一致性。
评论留言
欢迎您,!您可以在这里畅言您的的观点与见解!
0 条评论