【数据库技术】关系完整性约束(实体/参照/用户定义)

考点频率 :★★★★★(数据库基础必考,选择题常考三种约束的定义与区分)

难度 :⭐⭐

建议:重点掌握三种完整性约束的名称、各自保证什么、以及它们的实现机制(主键/外键/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

🔔 本专栏日更,点击头像 → 专栏《软考中级高频考点》订阅,第一时间接收新内容

#软考中级 #软件设计师 #实体完整性 #参照完整性 #用户定义完整性 #数据库技术基础 #软考备考

相关推荐
可乐鸡翅yeah_7 小时前
混合内容 Mixed‑Content 安全策略,HLS HTTPS 页面加载 HTTP 资源排错实战
运维·ffmpeg·音视频·媒体·m3u8
人效思维笔记7 小时前
阿米巴推行前,经营者要先做好哪些准备?
经验分享·笔记·阿米巴·阿米巴经营·中国式阿米巴
艾醒(AiXing-w)8 小时前
LangChain 1.0 智能体开发(三):Agent 记忆管理——从短期对话到跨会话长期记忆
数据库·人工智能·langchain
MSTcheng.8 小时前
KES 进了 K8s 之后运维归谁管?
数据库
曦夜日长8 小时前
Linux系统篇,进程概念(四):内核链表的深度理解、进程优先级的底层理解
linux·运维·服务器·php
Wang's Blog8 小时前
Java 接入Redis: Redis下载与源码编译安装
java·服务器·redis
知识的搬运工旺仔8 小时前
CREATE INDEX CONCURRENTLY:线上建索引不阻塞 DML 的代价与坑
数据库·后端·sql
志尊宝8 小时前
Vue3 零基础每日笔记(047):动态路由与路由参数——:id 传参、query 传参、props 解耦
前端·javascript·vue.js·笔记·html5
Ivanqhz8 小时前
矩阵引擎的数据流模式与 BM1684X 架构
java·服务器·网络·深度学习·神经网络
guo_wen_qiang9 小时前
mysql中有哪些日志
数据库·mysql