计算机应用

导航

第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
);

UNIQUEPRIMARY 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 时,若 sidstudent 里没有对应值 → 报错(拒绝脏数据)。


六、知识点:级联操作 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
自增跳号 删过行或事务回滚会导致不连续,正常,不影响唯一性

十、小测验(自测)

  1. AUTO_INCREMENT 有什么限制?为什么 sid INT AUTO_INCREMENT 而没设主键会报错?
  2. 写出给 scsid 加外键引用 student(sid) 的 SQL(ALTER 写法)。
  3. 主键和 UNIQUE 的主要区别是什么?
  4. 外键 ON DELETE CASCADEON DELETE RESTRICT 分别会发生什么?

【声明】本文由 AI 辅助生成,仅供 MySQL 数据库教学参考,如有疑误以教材为准。

posted on 2026-08-29 10:26  eagle福  阅读(11)  评论(0)    收藏  举报