考点频率 :★★★★★(数据库基础必考,选择题常考三种约束的定义与区分)
难度 :⭐⭐
建议:重点掌握三种完整性约束的名称、各自保证什么、以及它们的实现机制(主键/外键/Check等)
1️⃣ 什么是关系完整性约束?
关系完整性约束是数据模型三要素 之一(数据结构、数据操作、完整性约束)。它的作用是保证数据库中数据的正确性和一致性。
打个比方:你办一张银行卡,银行系统不会允许你设置"000000"这样的密码(用户定义完整性),不会让两个客户共用同一个身份证号(实体完整性),也不会让你转账时转到一个不存在的账户(参照完整性)。这些限制就是完整性约束。
三类完整性约束:
| 约束类型 | 保证什么 | 由谁定义 | 由谁保证 |
|---|---|---|---|
| 实体完整性 | 每个元组是可区分的(主键唯一且非空) | 用户定义主键时声明 | DBMS自动保证 |
| 参照完整性 | 表与表之间的关系是有效的(外键参照正确) | 用户定义外键时声明 | DBMS自动保证 |
| 用户定义完整性 | 业务规则的合理性(如年龄范围) | 用户定义约束条件 | DBMS自动保证 |
2️⃣ 实体完整性(Entity Integrity)
2.1 定义
实体完整性 保证关系中的每个元组是唯一的、可区分的。
2.2 核心规则
| 规则 | 说明 |
|---|---|
| 主键值不能为空(NOT NULL) | 任何元组的主键属性都不能取NULL值 |
| 主键值必须唯一(UNIQUE) | 任何两个元组的主键值不能相同 |
2.3 为什么实体完整性是"最基本"的约束?
因为关系模型要求"元组是可区分的"。如果没有实体完整性,表中可能会出现两个完全相同的行,我们无法唯一地标识和操作某一行数据。
2.4 实现方式
- 通过主键(Primary Key) 约束来实现
- 主键可以是单个属性,也可以是多个属性的组合(联合主键)
联合主键 :如果一个属性不足以唯一标识元组,可以组合多个属性作为主键。比如选课表中,
(学号, 课程号)联合起来才能唯一标识一条选课记录。
2.5 软考易错点
- 主键不能为NULL(这是实体完整性的核心规则)
- 主键不能重复
- 候选键(即可能成为主键的属性)也要求不能为NULL
⚠️ 常见误区:有些同学认为主键只是"不能重复",忘了"不能为空"也是实体完整性的要求。
3️⃣ 参照完整性(Referential Integrity)
3.1 定义
参照完整性 保证表与表之间的关系是有效的 。它要求:关系中外键(Foreign Key) 的值要么为NULL,要么等于被参照关系中某个元组的主键值。
3.2 核心规则
| 规则 | 说明 |
|---|---|
| 外键值存在性 | 外键的值(非NULL时)必须出现在被参照关系的主键中 |
| 外键可为NULL | 外键允许取NULL值(表示暂无关联) |
| 不允许"悬空引用" | 不能引用一个不存在的元组 |
3.3 为什么需要参照完整性?
数据表之间往往存在引用关系。比如"选课表"引用了"学生表"中的学号------如果某个选课记录引用了一个根本不存在的学号,这个数据就是无效的。参照完整性就是为了防止这种情况。
3.4 实现方式
- 通过外键(Foreign Key) 约束来实现
- 外键声明时,需要指定被参照的表和属性
示例:
sql
-- 选课表中的学号引用了学生表中的学号
FOREIGN KEY (学号) REFERENCES 学生表(学号)
3.5 外键约束的级联操作
当被参照表中的主键值被修改或删除时,DBMS可以采取不同的处理方式(软考常考):
| 级联操作 | 含义 |
|---|---|
| CASCADE(级联) | 修改/删除主键时,自动修改/删除所有引用的外键 |
| NO ACTION(无操作) | 如果有外键引用,拒绝修改/删除主键 |
| SET NULL(设为空) | 修改/删除主键时,将外键设为NULL |
| SET DEFAULT(设默认值) | 修改/删除主键时,将外键设为默认值 |
3.6 软考易错点
- 外键可以取NULL(这是与主键最大的区别,选择题常考)
- 外键必须 引用另一个表的主键(或候选键)
- 外键的取值必须在被参照表的主键中存在(不能悬空)
4️⃣ 用户定义完整性(User-defined Integrity)
4.1 定义
用户定义完整性 是用户根据业务规则 自行定义的约束条件。它保证了数据的语义合理性。
4.2 核心规则
用户定义完整性包含各种针对具体数据的约束:
- 取值范围约束(CHECK)
- 数据类型约束(INT、VARCHAR等)
- 唯一性约束(UNIQUE)
- 非空约束(NOT NULL)
- 默认值约束(DEFAULT)
4.3 实现方式
通过CREATE TABLE或ALTER TABLE语句中的约束子句实现:
示例:
sql
CREATE TABLE 学生表 (
学号 CHAR(8) PRIMARY KEY,
姓名 VARCHAR(20) NOT NULL,
性别 CHAR(1) CHECK (性别 IN ('男', '女')),
年龄 INT CHECK (年龄 >= 0 AND 年龄 <= 120),
班级 VARCHAR(20)
);
4.4 软考易错点
- 用户定义完整性是DBMS自动保证的
- NOT NULL和UNIQUE都是用户定义完整性,不是实体完整性
5️⃣ 三种完整性约束对比表(重点)
| 对比项 | 实体完整性 | 参照完整性 | 用户定义完整性 |
|---|---|---|---|
| 核心问题 | 元组是否唯一? | 关系是否有效? | 数据是否合理? |
| 关键概念 | 主键(Primary Key) | 外键(Foreign Key) | CHECK、NOT NULL、UNIQUE、DEFAULT |
| 能否为NULL | 主键不能为NULL | 外键可以NULL | 取决于约束定义 |
| 约束的是 | 单个关系的内部 | 两个关系之间 | 单个关系内部 |
| 保证的是 | 元组可区分 | 引用有效 | 业务规则合理 |
6️⃣ 经典例题
例题1:在关系数据库中,参照完整性约束通过( )实现。
A. 主键
B. 外键
C. 检查约束
D. 唯一约束
解析 :参照完整性通过外键 实现。主键对应的是实体完整性;检查约束和唯一约束属于用户定义完整性。选 B。
例题2:下列关于关系完整性约束的叙述中,错误的是( )。
A. 实体完整性要求主键不能取NULL值
B. 参照完整性要求外键必须取被参照表主键中存在的值
C. 外键可以取NULL值
D. 用户定义完整性由用户自己定义,DBMS不负责维护
解析 :D错误------用户定义完整性在创建表时定义后,DBMS会自动维护和检查 。A、B、C均正确。选 D。
例题3(判断):外键可以为NULL,也可以重复。( )
解析:正确。外键的取值可以重复(多个元组可以引用同一个外键值),也可以为NULL(表示暂无关联)。这与主键的"唯一+非空"完全不同。
7️⃣ 记忆口诀
实体完整看主键,非空唯一是核心。
参照完整看外键,要么有值要么空。
用户定义业务规,范围检查数据对。
8️⃣ 小测验(评论区对答案)
下列关于关系完整性约束的说法中,正确的是( )。
A. 实体完整性要求主键可以取NULL值
B. 参照完整性要求外键必须唯一
C. 用户定义完整性在定义后由DBMS自动维护
D. 外键必须引用另一个表的主键,且不能为NULL
🔔 本专栏日更,点击头像 → 专栏《软考中级高频考点》订阅,第一时间接收新内容
#软考中级 #软件设计师 #实体完整性 #参照完整性 #用户定义完整性 #数据库技术基础 #软考备考