第07周 表约束与字段自动增长
第7周 · 表约束与字段自动增长
约束(Constraint)就是给字段立规矩,防止脏数据进库:重复学号、空姓名、非法年龄……这周把常用约束和外键、自动增长一起学透。
一、知识点:约束有哪些
| 约束 | 作用 | 是否可重复 | 是否可空 |
|---|---|---|---|
PRIMARY KEY 主键 |
唯一标识一行 | 不可 | 不可 |
NOT NULL 非空 |
必须有值 | — | 不可 |
UNIQUE 唯一 |
值不重复 | 可(但只能一个 NULL) | 可 |
DEFAULT 默认 |
不填时用默认值 | — | 可 |
FOREIGN KEY 外键 |
引用另一张表的值 | 可 | 可 |
CHECK 检查 |
限定取值范围 | — | 可 |
AUTO_INCREMENT 自增 |
插入时自动+1 | — | — |
二、操作教程:非空与默认值
CREATE TABLE student (
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(20) NOT NULL, -- 姓名必须有,不能空
sage INT DEFAULT 18, -- 不填年龄时默认 18
sdept VARCHAR(30)
);
插入时不写 sname 会报错;不写 sage 则自动填 18。
三、操作教程:AUTO_INCREMENT 自动增长
CREATE TABLE student (
sid INT PRIMARY KEY AUTO_INCREMENT, -- 主键 + 自增
sname VARCHAR(20) NOT NULL
);
INSERT INTO student (sname) VALUES ('张三'); -- 不写 sid
INSERT INTO student (sname) VALUES ('李四');
SELECT * FROM student;
结果:sid 自动变成 1、2……不用手动填,系统递增。
重要限制:
AUTO_INCREMENT必须作用在主键或有唯一索引的列上,否则报错。一张表只能有一个自增列。
四、知识点:唯一约束 UNIQUE
-- 学号(身份证号)不允许重复
CREATE TABLE student (
sid INT PRIMARY KEY AUTO_INCREMENT,
idcard CHAR(18) UNIQUE, -- 身份证号唯一
sname VARCHAR(20) NOT NULL
);
UNIQUE与PRIMARY KEY区别:主键既唯一又非空且一张表只有一个;UNIQUE允许有(且仅一个)NULL,一张表可加多个。
五、知识点 + 操作:外键 FOREIGN KEY(重点·难点)
场景:成绩表 sc(sid, cid, grade) 里的 sid 必须"真的存在"于学生表 student(sid) 中,不能出现一个不存在的学生的成绩。这就是"引用一致性",用外键保证。
-- 建 sc 时直接定义外键
CREATE TABLE sc (
sid INT,
cid INT,
grade DECIMAL(5,2),
FOREIGN KEY (sid) REFERENCES student(sid)
);
-- 或给已存在的表加外键
ALTER TABLE sc ADD FOREIGN KEY (sid) REFERENCES student(sid);
外键要点:
1. 子表(sc)外键列的类型、长度必须和父表(student)被引用列一致。
2. 父表被引用列必须是主键或唯一索引。
3. 插入 sc 时,若 sid 在 student 里没有对应值 → 报错(拒绝脏数据)。
六、知识点:级联操作 ON DELETE / ON UPDATE
删父表一行(如开除某学生)时,子表里他的成绩怎么办?用级联策略指定:
CREATE TABLE sc (
sid INT,
cid INT,
grade DECIMAL(5,2),
FOREIGN KEY (sid) REFERENCES student(sid)
ON DELETE CASCADE -- 父表删除学生,子表他的成绩跟着删
ON UPDATE CASCADE -- 父表改 sid,子表同步改
);
| 策略 | 含义 |
|---|---|
CASCADE |
跟着父表一起删/改 |
SET NULL |
子表外键置为 NULL(外键列须允许 NULL) |
RESTRICT / NO ACTION |
拒绝删除/修改父表(默认,最安全) |
考试常考:默认是
RESTRICT,即"父表有子记录就删不掉",需先删子表数据。
七、知识点:CHECK 约束
CHECK 用来限制取值范围(MySQL 8.0 已真正生效):
CREATE TABLE student (
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(20) NOT NULL,
sage INT CHECK (sage > 0 AND sage < 150) -- 年龄必须在 1~149
);
八、综合实操:主外键与约束
USE school;
-- 学生表:主键自增 + 姓名非空 + 年龄默认 18
CREATE TABLE student (
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(20) NOT NULL,
sage INT DEFAULT 18,
sdept VARCHAR(30)
);
-- 成绩表:sid 外键引用 student(sid)
CREATE TABLE sc (
sid INT,
cid INT,
grade DECIMAL(5,2),
FOREIGN KEY (sid) REFERENCES student(sid)
ON DELETE CASCADE
);
九、易混点排查表
| 现象 | 解决方法 |
|---|---|
AUTO_INCREMENT 报错 |
自增列必须是主键或唯一索引;且一张表只能一个 |
| 插入报外键冲突 | 子表外键值在父表里不存在;先插父表再插子表 |
| 外键建不上 | 两列类型/长度不一致,或父表列不是主键/唯一 |
| 删父表提示被外键占用 | 默认 RESTRICT 拒绝;先删子表相关行,或设 CASCADE |
| 唯一列能插两个 NULL | 正常(UNIQUE 允许一个 NULL);要禁止空用 NOT NULL |
| 自增跳号 | 删过行或事务回滚会导致不连续,正常,不影响唯一性 |
十、小测验(自测)
AUTO_INCREMENT有什么限制?为什么sid INT AUTO_INCREMENT而没设主键会报错?- 写出给
sc的sid加外键引用student(sid)的 SQL(ALTER 写法)。 - 主键和 UNIQUE 的主要区别是什么?
- 外键
ON DELETE CASCADE和ON DELETE RESTRICT分别会发生什么?
【声明】本文由 AI 辅助生成,仅供 MySQL 数据库教学参考,如有疑误以教材为准。
浙公网安备 33010602011771号