一、数据库完整性基础
1. 核心定义:完整性 = 正确性 + 相容性
| 维度 |
含义 |
示例 |
| 数据正确性 |
符合现实语义、反映实际状况 |
国内性别仅 “男 / 女”,国外可能有其他选项 |
| 数据相容性 |
同一对象在不同表中数据一致 |
同一个人不能有两个不同身份证号 |
2. 完整性 vs 安全性(易混淆点)
| 对比项 |
数据库完整性 |
数据库安全性 |
| 核心目标 |
防止不合语义的不正确数据 |
防止恶意破坏和非法存取 |
| 防范对象 |
错误数据 |
非法用户、非法操作 |
3. DBMS 维护完整性的 3 大机制
- 定义约束条件:用 SQL 的 DDL 语句定义(实体完整性、参照完整性、用户自定义完整性),存入数据字典
- 检查约束:执行
INSERT/DELETE/UPDATE后或事务提交时自动检查
- 违约处理:拒绝操作、级联执行操作等(类似 “违纪处理”)
二、三大核心完整性约束
1. 实体完整性(主键约束)
(1)定义:用PRIMARY KEY指定主键(唯一标识实体,非空且唯一)
- 单属性主键:列级 / 表级定义均可
- 列级定义示例(Student 表,Sno 为主键):
CREATE TABLE Student (
Sno CHAR(9) PRIMARY KEY, -- 列级指定主键
Sname CHAR(20) NOT NULL,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
);
- 表级定义示例:
CREATE TABLE Student (
Sno CHAR(9),
Sname CHAR(20) NOT NULL,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20),
PRIMARY KEY (Sno) -- 表级指定主键
);
- 多属性联合主键:仅能表级定义(如 SC 表,Sno+Cno 为主键):
CREATE TABLE SC (
Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY (Sno, Cno) -- 联合主键,表级定义
);
(2)检查与违约处理
- 检查时机:
INSERT新记录或UPDATE主键列时
- 检查内容:① 主键值是否唯一(重复则拒绝操作)② 主键各属性是否为空(任一为空则拒绝操作)
2. 参照完整性(外键约束)
(1)定义:用FOREIGN KEY...REFERENCES指定外键(参照其他表的主键,保证数据一致性)
- 示例(SC 表的 Sno 参照 Student 表的 Sno,Cno 参照 Course 表的 Cno):
CREATE TABLE SC (
Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY (Sno, Cno), -- 实体完整性
-- 参照完整性:Sno外键,参照Student的Sno
FOREIGN KEY (Sno) REFERENCES Student(Sno),
-- 参照完整性:Cno外键,参照Course的Cno
FOREIGN KEY (Cno) REFERENCES Course(Cno)
);
(2)检查与违约处理(3 种策略)
| 被参照表操作(如 Student) |
参照表影响(如 SC) |
违约处理策略 |
| - |
插入 / 修改外码值 |
拒绝(默认,外码无对应主键则不允许) |
| 删除元组 |
参照表有依赖记录 |
① 拒绝(默认);② 级联删除(删除被参照表记录时,删除参照表依赖记录);③ 设置为空(外码允许空时,将依赖记录的外码设为空) |
| 修改主码值 |
参照表有依赖记录 |
① 拒绝(默认);② 级联修改(修改被参照表主码时,同步修改参照表外码);③ 设置为空(外码允许空时,将依赖记录的外码设为空) |
- 显式指定策略示例(SC 表,Sno 级联删改,Cno 删除拒绝、更新级联):
CREATE TABLE SC (
Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY (Sno, Cno),
-- Sno:删除/更新时级联处理
FOREIGN KEY (Sno) REFERENCES Student(Sno)
ON DELETE CASCADE
ON UPDATE CASCADE,
-- Cno:删除时拒绝,更新时级联
FOREIGN KEY (Cno) REFERENCES Course(Cno)
ON DELETE NO ACTION
ON UPDATE CASCADE
);
3. 用户定义的完整性(自定义语义约束)
(1)属性级约束(针对单个属性的规则)
| 约束类型 |
关键字 / 短语 |
示例 |
| 非空 |
NOT NULL |
SC 表的 Sno、Cno、Grade 非空:Sno CHAR(9) NOT NULL |
| 唯一 |
UNIQUE |
DEPT 表的 Dname 唯一:Dname CHAR(9) UNIQUE |
| 取值范围 |
CHECK(条件) |
Student 表 Ssex 仅 “男 / 女”:Ssex CHAR(2) CHECK (Ssex IN ('男','女'));SC 表 Grade 0-100:Grade SMALLINT CHECK (Grade>=0 AND Grade<=100) |
| 缺省值 |
DEFAULT |
Student 表 Sage 默认 18:Sage SMALLINT DEFAULT 18;Orders 表 OrderDate 默认当前时间:OrderDate date DEFAULT GETDATE() |
(2)元组级约束(多个属性间的关联规则,用CHECK)
- 示例:学生性别为 “男” 时,姓名不能以 “Ms.” 开头:
CREATE TABLE Student (
Sno CHAR(9) PRIMARY KEY,
Sname CHAR(8) NOT NULL,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20),
-- 元组约束:Ssex和Sname关联
CHECK (Ssex='女' OR Sname NOT LIKE 'Ms.%')
);
(3)检查与违约处理
- 时机:
INSERT或UPDATE时
- 处理:不满足约束则拒绝操作
三、完整性约束命名字句(CONSTRAINT)
1. 作用:给约束命名,方便后续修改 / 删除(灵活管理约束)
2. 语法:CONSTRAINT <约束名> [PRIMARY KEY/FOREIGN KEY/CHECK/UNIQUE/NOT NULL]
3. 示例(Student 表,命名 5 个约束):
CREATE TABLE Student (
-- C1:学号90000~99999
Sno NUMERIC(6) CONSTRAINT C1 CHECK (Sno BETWEEN 90000 AND 99999),
-- C2:姓名非空
Sname CHAR(20) CONSTRAINT C2 NOT NULL,
-- C3:年龄<30
Sage NUMERIC(3) CONSTRAINT C3 CHECK (Sage < 30),
-- C4:性别仅男/女
Ssex CHAR(2) CONSTRAINT C4 CHECK (Ssex IN ('男','女')),
-- StudentKey:主键约束
CONSTRAINT StudentKey PRIMARY KEY(Sno)
);
4. 约束的修改与删除(用ALTER TABLE)
- 删除约束:
ALTER TABLE <表名> DROP CONSTRAINT <约束名>示例:删除 Student 表的 C4(性别约束):
ALTER TABLE Student DROP CONSTRAINT C4;
- 修改约束:先删除旧约束,再新增新约束示例:学号范围改为 900000~999999,年龄改为 < 40:
-- 删除旧C1(学号约束)
ALTER TABLE Student DROP CONSTRAINT C1;
-- 新增C1(新学号约束)
ALTER TABLE Student ADD CONSTRAINT C1 CHECK (Sno BETWEEN 900000 AND 999999);
-- 删除旧C3(年龄约束)
ALTER TABLE Student DROP CONSTRAINT C3;
-- 新增C3(新年龄约束)
ALTER TABLE Student ADD CONSTRAINT C3 CHECK (Sage < 40);
四、小结
- 核心目标:保证数据库中数据正确、一致(区别于安全性的 “防非法操作”)
- 三大约束体系:
- 实体完整性:主键(非空唯一)
- 参照完整性:外键(参照主键,级联 / 拒绝 / 设空处理)
- 用户定义完整性:属性 / 元组级自定义规则(非空、唯一、取值范围等)
- 管理工具:
CONSTRAINT命名约束,ALTER TABLE修改 / 删除约束
- DBMS 机制:定义约束→检查约束→违约处理(闭环保障完整性)
所有评论(0)