前言
在 MySQL 数据库开发中,我们总希望存入表中的数据是合法、规范、符合业务逻辑的。虽然数据类型能对字段做基础限制,但面对复杂的业务需求,仅靠数据类型远远不够。比如要求邮箱唯一、用户名不能为空、学生的班级必须是已存在的班级……这些需求都需要靠表的约束来实现。
表的约束是数据库保证数据完整性的核心手段,它能从业务逻辑层面过滤无效数据,避免脏数据进入数据库。今天这篇文章就带大家全面吃透 MySQL 中最常用的表约束,包括 null/not null、default、comment、zerofill、primary key、auto_increment、unique key、foreign key,从基础概念到实操案例,手把手教你用约束拿捏数据合法性!

一、为什么需要表的约束?
先看一个简单的例子:如果我们创建一个班级表,只定义字段和数据类型,不添加任何约束,会发生什么?
-- 无约束的班级表 create table myclass( class_name varchar(20), class_room varchar(10) );
-- 可以插入无班级名、无教室的无效数据 insert into myclass values(null, null);
这样插入的数据完全没有业务意义——没有班级名,不知道是哪个班级;没有教室,不知道在哪上课。而如果我们添加了约束,MySQL 就会直接拒绝这类无效数据的插入,从源头保证数据质量。
简单来说,数据类型约束是'语法层'的,表的约束是'业务层'的。数据类型决定字段能存什么类型的数据(比如字符串还是数字),表的约束决定字段能存什么值(比如是否为空、是否唯一)。
二、基础约束:搞定字段的基础规则
基础约束主要针对单个字段的基础属性做限制,是日常开发中使用频率最高的约束,包括空属性 null/not null、默认值 default、列描述 comment、零填充 zerofill,上手简单,效果显著。
2.1 空属性:null /not null
MySQL 中字段的空属性只有两个值:null(默认值,允许字段为空)和 not null(禁止字段为空)。
核心原则:实际开发中,尽可能让字段设置为 not null!因为 null 值无法参与任何运算,会导致查询和统计出现意想不到的问题。
-- 测试 null 值的运算 select 1 + null; -- 结果为 NULL select concat('hello', null); -- 结果为 NULL
如果字段存了 null,后续做求和、拼接、筛选时都要额外处理,增加开发成本。
实操案例:创建有非空约束的班级表,要求班级名和教室都不能为空:
-- 创建带 not null 约束的班级表 create table myclass( class_name varchar(20) not null, class_room varchar(10) not null );
-- 正常插入:字段都有值,插入成功 insert into myclass values('Python01 班', '301 教室');
-- 无效插入:缺少 class_room 字段,插入失败 insert into myclass(class_name) values('Python02 班'); -- 报错:ERROR 1364 (HY000): Field 'class_room' doesn't have a default value
通过 desc 表名 可以查看字段的空属性约束:
myclass;


