一文系统梳理MySQL数据库中表的约束

 更新时间:2026年05月12日 09:11:20   作者:重生之小比特  
本文系统梳理了MySQL表的8种约束,即NULL/NOT NULL,DEFAULT,COMMENT,ZEROFILL,PRIMARY KEY,AUTO_INCREMENT,UNIQUE KEY和FOREIGN KEY,从开发高频考点到配易错,看完直接能用在项目里

今天这篇博客,我把 MySQL 里表的约束从头到尾梳理一遍,全部是面试、开发高频考点,配案例、配语法、配易错点,看完直接能用在项目里。

一、什么是表约束?为什么要用?

数据类型只能做最基础的限制,但业务里要求更严格:比如邮箱不能重复、姓名不能为空、学号必须唯一、成绩不能为负……

约束 = 给字段加 “规则”,从业务层面保证数据合法、正确、不混乱。

MySQL 常用约束一共 8 个:NULL / NOT NULLDEFAULTCOMMENTZEROFILLPRIMARY KEYAUTO_INCREMENTUNIQUE KEYFOREIGN KEY

二、空属性:NULL / NOT NULL

作用

控制字段是否允许为空

  • NULL:允许为空(默认)
  • NOT NULL:不允许为空

关键点

  • 空值无法参与运算:1 + NULL = NULL
  • 实际开发尽量用 NOT NULL,数据更可靠

示例

CREATE TABLE myclass(
    class_name VARCHAR(20) NOT NULL,
    class_room VARCHAR(10) NOT NULL
);

插入时缺了 class_room 直接报错:

ERROR 1364 : Field 'class_room' doesn't have a default value

三、默认值:DEFAULT

作用

插入数据时不指定该字段,自动使用预设值。

示例

CREATE TABLE tt10 (
    name VARCHAR(20) NOT NULL,
    age TINYINT UNSIGNED DEFAULT 0,
    sex CHAR(2) DEFAULT '男'
);

只插 name,age=0、sex = 男 自动填充:

INSERT INTO tt10(name) VALUES('zhangsan');

四、列描述:COMMENT

作用

给字段加注释说明,方便团队维护。

示例

CREATE TABLE tt12 (
    name VARCHAR(20) NOT NULL COMMENT '姓名',
    age TINYINT UNSIGNED DEFAULT 0 COMMENT '年龄'
);

查看注释

SHOW CREATE TABLE tt12\G

五、零填充:ZEROFILL

作用

数字不足指定位数时,前面补 0,只影响显示,不影响存储。

示例

ALTER TABLE tt3 CHANGE a a INT(5) UNSIGNED ZEROFILL;

插入 1 → 显示 00001,实际存储还是 1

六、主键:PRIMARY KEY

作用

唯一标识一行数据,约束最强:

  • 不能重复
  • 不能为空
  • 一张表最多一个主键

示例

CREATE TABLE tt13 (
    id INT UNSIGNED PRIMARY KEY COMMENT '学号',
    name VARCHAR(20) NOT NULL
);

复合主键

多个字段一起做主键,组合唯一:

CREATE TABLE tt14(
    id INT UNSIGNED,
    course CHAR(10),
    PRIMARY KEY(id, course)
);

追加 / 删除主键

ALTER TABLE 表 ADD PRIMARY KEY(字段);
ALTER TABLE 表 DROP PRIMARY KEY;

七、自增长:AUTO_INCREMENT

作用

字段不赋值时自动 + 1,通常配合主键使用。

特点

  • 必须是索引列
  • 必须是整数
  • 一张表最多一个自增

示例

CREATE TABLE tt21(
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(10) NOT NULL DEFAULT ''
);

获取刚插入的自增 ID

SELECT LAST_INSERT_ID();

八、唯一键:UNIQUE KEY

作用

保证字段业务不重复,但允许为 NULL。

主键 vs 唯一键

  • 主键:不能为空,一张表一个
  • 唯一键:可以为空,一张表多个

示例

CREATE TABLE student (
    id CHAR(10) UNIQUE COMMENT '学号',
    name VARCHAR(10)
);

九、外键:FOREIGN KEY

作用

约束表与表之间的关系,保证数据逻辑一致。

规则:

  • 从表外键的值 必须在主表主键里存在
  • 或为 NULL

示例

先建主表(班级):

CREATE TABLE myclass (
    id INT PRIMARY KEY,
    name VARCHAR(30) NOT NULL
);

再建从表(学生):

CREATE TABLE stu (
    id INT PRIMARY KEY,
    name VARCHAR(30) NOT NULL,
    class_id INT,
    FOREIGN KEY (class_id) REFERENCES myclass(id)
);

插入不存在的班级 ID 直接报错,保证数据不乱。

十、综合实战:商城三表设计(高频面试题)

商品表、客户表、订单表,一次写完主外键 + 所有约束:

CREATE DATABASE IF NOT EXISTS mall DEFAULT CHARSET utf8;
USE mall;

-- 商品表
CREATE TABLE goods(
    goods_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '商品ID',
    goods_name VARCHAR(32) NOT NULL COMMENT '商品名',
    unitprice INT NOT NULL DEFAULT 0 COMMENT '单价(分)',
    category VARCHAR(12) COMMENT '类别',
    provider VARCHAR(64) NOT NULL COMMENT '供应商'
);

-- 客户表
CREATE TABLE customer(
    customer_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '客户ID',
    name VARCHAR(32) NOT NULL COMMENT '姓名',
    address VARCHAR(256) COMMENT '地址',
    email VARCHAR(64) UNIQUE COMMENT '邮箱',
    sex ENUM('男','女') NOT NULL COMMENT '性别',
    card_id CHAR(18) UNIQUE COMMENT '身份证'
);

-- 订单表
CREATE TABLE purchase(
    order_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '订单ID',
    customer_id INT COMMENT '客户ID',
    goods_id INT COMMENT '商品ID',
    nums INT DEFAULT 0 COMMENT '数量',
    FOREIGN KEY (customer_id) REFERENCES customer(customer_id),
    FOREIGN KEY (goods_id) REFERENCES goods(goods_id)
);

十一、高频考点速记(面试必背)

  1. NOT NULL 不能为空,DEFAULT 提供默认值
  2. COMMENT 是注释,ZEROFILL 只补 0 不改变存储
  3. 主键唯一且非空,一张表一个
  4. 自增长必须是整数、索引列
  5. 唯一键允许 NULL,可建多个
  6. 外键保证表关系合法,主表必须有主键 / 唯一键

十二、MySQL 约束|表结构修改|数据修改 终极对比表

(一眼不混,直接背)

分类作用关键字 / 语句示例
1. 字段约束(建表用)给字段定规则(不能为空、唯一、默认值等)NOT  NULL   DEFAULT  COMMENT  ZERO  FILL   PRIMARY KEY  AUTO_INCREMENT    UNIQUE  KEY  FOREIGN  KEYname VARCHAR(20) NOT NULLage INT DEFAULT 0id INT PRIMARY KEY AUTO_INCREMENT
2. 修改表结构(ALTER)改表:加字段、删字段、改约束、加主键ALTER TABLE 表ADD(添加)DROP(删除)MODIFY(改类型 / 约束)CHANGE(改名 + 改类型)ALTER TABLE t ADD PRIMARY KEY(id);ALTER TABLE t MODIFY name NOT NULL;
3. 修改表中数据改表里的内容:增 / 删 / 改记录INSERT(插入)UPDATE(修改)DELETE(删除)INSERT INTO t VALUES (1,' 张三 ');UPDATE t SET name=' 李四 ' WHERE id=1;DELETE FROM t WHERE id=1;

最核心记忆口诀(背会永不混)

  • 约束:管字段规则(NOT NULL / PRIMARY KEY 等)
  • ALTER:管表结构(加字段、改约束、加主键)
  • INSERT / UPDATE / DELETE:管表里的数据

十三、结束语

MySQL 约束看似多,其实逻辑非常统一:都是为了管住数据,不让脏数据进库。开发时先想清楚字段规则,再建表,后面少填无数坑。

以上就是一文系统梳理MySQL数据库中表的约束的详细内容,更多关于MySQL表约束的资料请关注脚本之家其它相关文章!

相关文章

  • 浅谈MySQL大表优化方案

    浅谈MySQL大表优化方案

    这篇文章主要介绍了浅谈MySQL大表优化方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Mysql数据库乐观锁与悲观锁示例详解

    Mysql数据库乐观锁与悲观锁示例详解

    乐观锁和悲观锁是并发控制的一种机制,用于多线程或多进程环境下对共享资源的访问管理,以防止数据不一致或竞态条件,这篇文章主要介绍了Mysql数据库乐观锁与悲观锁的相关资料,需要的朋友可以参考下
    2026-04-04
  • Mysql行锁和表锁的实现示例

    Mysql行锁和表锁的实现示例

    行锁和表锁是两种常见的锁定机制,本文主要介绍了Mysql行锁和表锁,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • MySQL实现数据更新的示例详解

    MySQL实现数据更新的示例详解

    这篇文章主要为大家详细介绍了MySQL实现数据更新的相关资料,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • MySQL与PHP的基础与应用专题之增删改查

    MySQL与PHP的基础与应用专题之增删改查

    MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,本系列将带你掌握php与mysql的基础应用,本篇从数据库的增删改查开始
    2022-02-02
  • MySQL如何创建触发器

    MySQL如何创建触发器

    这篇文章主要为大家详细介绍了MySQL如何创建触发器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • MySQL的数据类型和建库策略分析详解

    MySQL的数据类型和建库策略分析详解

    无论是在小得可怜的免费数据库空间或是大型电子商务网站,合理的设计表结构、充分利用空间是十分必要的。这就要求我们对数据库系统的常用数据类型有充分的认识。下面我就将我的一点心得写出来跟大家分享。
    2008-04-04
  • MySQL workbench 数据库备份的实现步骤

    MySQL workbench 数据库备份的实现步骤

    本文主要介绍了MySQL workbench 数据库备份的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-04-04
  • Mysql索引结合explain分析示例

    Mysql索引结合explain分析示例

    本文主要介绍了Mysql索引结合explain分析示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Mysql中关于Incorrect string value的解决方案

    Mysql中关于Incorrect string value的解决方案

    在对mysql数据库中插入数据的时候,直接插入中文是没有问题的!但是用预编译语句时,用流对数据进行处理总报incorrect string value这个异常。本篇文章教给你解决方法
    2021-09-09

最新评论