MySQL 视频课 · 50 集 / 约束:概述、演示、外键与更新删除行为 / P32
第 32 集 / 共 50 · 约束:概述、演示、外键与更新删除行为 · 视频 p=32 · 时长 4:30
P32 32. 基础-约束-概述
看视频,对照阅读:在新标签打开原视频(p=32)
约束这一章从“为什么需要规则”讲起,再列六类约束。
复习模式:快速跳知识点(详解在下方各节)
复习顺序:先看“一句话理解”能否复述,再扫步骤,最后做自测;答不出时回到小例与易错。
一句话理解
约束是写在表字段上的规则,用来挡住不该进库的数据;它由数据库替你检查。
按这 4 步做
- 先分清目的:约束保证数据的正确、有效、完整,而不是替业务做全部判断。
- 记六类:非空 NOT NULL、唯一 UNIQUE、主键 PRIMARY KEY、默认 DEFAULT、检查 CHECK、外键 FOREIGN KEY。
- 决定写在哪:建表时直接写在字段后面,或建表后用 ALTER TABLE 补上。
- 检查版本:CHECK 从 8.0.16 起才真正生效,更早版本会解析但忽略。
小例
CREATE TABLE practice_score (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(10) NOT NULL UNIQUE,
score INT CHECK (score >= 0 AND score <= 100),
level CHAR(1) DEFAULT 'C'
) ENGINE = InnoDB;
【原创演示】这是本笔记的原创建表演示,不依赖任何已有表,表名也与视频里的 user 表不同。四列各带一种约束:id 用主键 + 自增,name 非空且唯一,score 用 CHECK 限定 0–100,level 缺省为 'C'。本页原创例已在隔离的 MySQL 8.0.46 测试实例执行通过;你也可以用 p32.sql 在本地练习库跑一遍。
易错点
- 以为加了约束业务就安全:跨字段、跨表的规则(如“离职日期不早于入职”)约束管不全,仍需应用层校验。
- 在 8.0.16 之前的版本依赖 CHECK:语句能建成功却不拦数据,必须先确认版本。
- 不写约束名:后续要删除或修改时只能去查自动生成的名字。
30 秒速记
自测(2 题,先答再展开)
自测 1:约束能不能替代业务层的全部校验?
不能。约束擅长单表单行、可声明的规则;涉及流程、跨表组合、外部系统的规则无法用约束表达,仍要应用逻辑。
自测 2:为什么示例里显式写 ENGINE=InnoDB?
外键等特性依赖支持它的存储引擎,InnoDB 是 MySQL 8.0 默认且支持外键;写清楚可以避免换引擎后约束失效。
材料与来源
展开材料出处、讲义页码与证据等级
| 材料 | 类型 / 位置 | 支持了什么 |
|---|---|---|
| P32 原视频页(BV1Kr4y1i7ru) | 平台视频页 · P32;采样静帧 t012/t20/t30/t40/t50/t60/t70/t80/tend | t30 为“概述”页:概念、目的、六类约束表。 |
| MySQL 8.0 Reference:CREATE TABLE | 官方文档 | 核对约束写法与 CHECK 的版本要求,未逐字引用。 |
按 t30 帧核对:概述页写明“约束是作用于表中字段上的规则,用于限制存储在表中的数据”“目的:保证数据库中数据的正确、有效性和完整性”,并列出六类约束表格,其中 CHECK 标注“8.0.16版本之后”。t012 帧的目录里出现“事务”一词,属课程目录,不作为本集讲解内容。正文示例表为原创,未使用视频里的 user 表;无字幕。
讲义对照:讲义 4.1 约束概述 · p61–62(公开镜像;按主题对应,切点 notexact)
- 画面静帧 9 帧,采样点 0:12–4:17 / 全片 4:30(只用于确认画面主题,不作内容边界)
- 原声字幕未取得:匿名接口字幕轨为空且需登录,未使用任何账号
等级含义:平台视频页 / 官方文档 / 课件 = 原始材料;二手整理 = 参考;推断 = 未经核实。站内补充的解释与练习会在此说明。