三种完整性规则
一、基本概念
1.实体完整性
保证表中的每一行数据是唯一的、可识别的。通常通过**主键(Primary Key)**约束来实现,要求主键字段不能为空(NOT NULL)且值唯一。
2.参照完整性
维护表与表之间关联数据的一致性。通过**外键(Foreign Key)**约束实现,要求外键的值要么为空,要么必须等于被引用表中的某个主键值,避免出现“孤儿数据”。
3.用户定义完整性
针对特定业务场景制定的约束规则,如字段取值范围、格式等。通过检查约束(CHECK)、唯一约束(UNIQUE)、默认值(DEFAULT)或触发器(Trigger)等机制实现。
二、具体实例
场景描述
有三张表:
-
学生表 (Student)
-
课程表 (Course)
-
选课表 (SC)
1.实体完整性
规则:表中的每一行必须能被唯一标识,且主键不能为空。
实例:在 Student 表中,设置 Sno(学号)为主键。
CREATE TABLE Student (
Sno CHAR(10) PRIMARY KEY, -- 主键,唯一且非空
Sname VARCHAR(20),
Sage INT
);
- 违反例子:插入两条 Sno='2024001' 的记录,或插入一条 Sno=NULL 的记录,数据库会拒绝。
2.参照完整性
规则:外键的值要么为空,要么必须在被参照表的主键中存在。
实例:SC 表中的 Sno 和 Cno 分别参照 Student.Sno 和 Course.Cno 。
CREATE TABLE SC (
Sno CHAR(10),
Cno CHAR(6),
Score INT,
PRIMARY KEY (Sno, Cno),
FOREIGN KEY (Sno) REFERENCES Student(Sno), -- 参照完整性
FOREIGN KEY (Cno) REFERENCES Course(Cno)
);
- 违反例子:向 SC 表插入一条 Sno='9999999' 的记录,但 Student 表中没有该学号 → 插入失败。
3.用户定义完整性
规则:针对特定业务需求的约束,如取值范围、格式等。
实例:
-
在 Student 表中,限制 Sage 在 15~40 岁之间。
-
在 SC 表中,限制 Score 在 0~100 之间。
CREATE TABLE Student (
Sno CHAR(10) PRIMARY KEY,
Sname VARCHAR(20),
Sage INT CHECK (Sage BETWEEN 15 AND 40) -- 用户定义完整性
);
CREATE TABLE SC (
Sno CHAR(10),
Cno CHAR(6),
Score INT CHECK (Score >= 0 AND Score <= 100), -- 成绩范围
PRIMARY KEY (Sno, Cno),
FOREIGN KEY (Sno) REFERENCES Student(Sno),
FOREIGN KEY (Cno) REFERENCES Course(Cno)
);
- 违反例子:插入一条 Sage=10 的学生记录,或给某门课成绩赋 Score=105,数据库会报错。
总结
-
实体完整性 → 保证每条学生/课程记录是唯一、可识别的。
-
参照完整性 → 保证选课信息不会指向不存在的学生或课程。
-
用户定义完整性 → 保证年龄、成绩等符合业务常识。