
是思成呀:个人主页
引言:
在数据库设计中,约束是保障数据质量的核心机制 ------ 它能强制限制表中字段的存储规则,避免无效、重复或不一致的数据进入数据库。本文先从非空、唯一、主键、默认、检查这五类基础约束入手,结合实战案例拆解用法!
目录
[一、约束概述:数据库的 "数据规则守护者"](#一、约束概述:数据库的 “数据规则守护者”)
[1. 约束的定义与目的](#1. 约束的定义与目的)
[2. 约束的分类(基础篇)](#2. 约束的分类(基础篇))
[1. 创建带约束的用户表](#1. 创建带约束的用户表)
[2. 各类约束的效果验证](#2. 各类约束的效果验证)
[(1)主键约束:唯一标识 + 自增](#(1)主键约束:唯一标识 + 自增)
[四、图形化工具创建约束(DataGrip 示例)](#四、图形化工具创建约束(DataGrip 示例))
一、约束概述:数据库的 "数据规则守护者"
1. 约束的定义与目的
约束是作用于表中字段的规则,核心目的有两个:
- 保证数据质量:确保数据的正确性(如年龄不能为负数)、有效性(如手机号格式合法)、完整性(如必填字段不能为空)和一致性(如主键唯一标识每行数据);
- 实施业务规则:将业务逻辑固化到表结构中(如用户名唯一、身份证号不可重复),减少代码层的校验压力。
2. 约束的分类(基础篇)
基础约束主要作用于单表字段,包括以下五类:
| 约束类型 | 关键字 | 核心功能 | 典型应用场景 |
|---|---|---|---|
| 非空约束 | NOT NULL | 字段不能存储 NULL 值 | 用户名、手机号等必填字段 |
| 唯一约束 | UNIQUE | 字段值全表唯一(允许 NULL) | 身份证号、邮箱、用户名 |
| 主键约束 | PRIMARY KEY | 字段非空且唯一,作为行的唯一标识 | 用户 ID、订单 ID、商品 ID |
| 默认约束 | DEFAULT | 未赋值时自动填充预设值 | 状态字段(默认启用:1)、创建时间(默认当前时间) |
| 检查约束 | CHECK | 字段值满足指定条件 | 年龄(0 < age ≤ 120)、成绩(0 ≤ score ≤ 100) |
二、基础约束实战:创建用户表并验证约束
以创建 user 表为例,整合五类基础约束,实战演示约束的定义与效果。
1. 创建带约束的用户表
sql
use sicheng; -- 切换到 sicheng 数据库
drop table if exists user;
create table user (
id int primary key auto_increment comment '用户ID(主键,自增)',
name varchar(10) not null unique comment '用户名(非空+唯一)',
age int check(age > 0 and age <= 120) comment '年龄(检查约束:0~120)',
gender char(1) comment '性别(无约束)',
status char(1) default '1' comment '状态(默认值:1=启用)',
email varchar(50) unique comment '邮箱(唯一,允许NULL)'
) comment '用户表';
2. 各类约束的效果验证
(1)主键约束:唯一标识 + 自增
-
特性 :主键默认包含 "非空 + 唯一" 特性,搭配
AUTO_INCREMENT实现自动递增(从 1 开始); -
验证 1 :插入数据时不指定
id,自动生成连续值:sqlinsert into user(name, age) values('张三', 20); -- id=1 insert into user(name, age) values('李四', 25); -- id=2 insert into user(id, name, age) values(null, '赵六', 28); -- 主键能为NULL(自增字段可省略id,能显式传NULL) -
验证 2 :插入重复
id或 NULLid均报错:sqlinsert into user(id, name, age) values(1, '王五', 30); -- 报错:Duplicate entry '1' for key 'PRIMARY' -
注意 :插入失败的操作会消耗自增值(如上述报错后,下一条插入的
id会是 3,而非 2)。
(2)非空约束:必填字段不可空
-
验证 :插入
name为 NULL 的数据,直接报错:sqlinsert into user(name, age) values(null, 22); -- 报错:Column 'name' cannot be null
(3)唯一约束:字段值不可重复
-
特性:唯一约束允许 NULL 值(多个 NULL 不视为重复),但非 NULL 值必须唯一;
-
验证 1 :插入重复
name报错:sqlinsert into user(name, age) values('张三', 30); -- 报错:Duplicate entry '张三' for key 'name' -
验证 2 :插入多个 NULL
email正常:sqlinsert into user(name, age, email) values('王五', 28, null); insert into user(name, age, email) values('赵六', 32, null); -- 成功,NULL 不触发唯一约束
(4)默认约束:未赋值时自动填充
-
验证 :插入数据时不指定
status,自动填充默认值1:sqlinsert into user(name, age) values('孙七', 26); select name, status from user where name = '孙七'; -- 结果:孙七 | 1 -
覆盖默认值 :显式指定
status时,以指定值为准:sqlinsert into user(name, age, status) values('周八', 29, '0'); select name, status from user where name = '周八'; -- 结果:周八 | 0
(5)检查约束:字段值满足条件
-
注意:MySQL 8.0.16 及以上版本支持检查约束,低版本会忽略该约束;
-
验证 :插入年龄为负数或超过 120,报错:
sqlinsert into user(name, age) values('吴九', -5); -- 报错:Check constraint 'user_chk_1' is violated insert into user(name, age) values('郑十', 121); -- 报错:同上
三、基础约束的核心易错点
- 主键 vs 唯一约束 :
- 主键:每张表只能有一个,非空且唯一,自动创建索引;
- 唯一约束:每张表可多个,允许 NULL,同样创建索引;
- NULL vs 空字符串 :
- 非空约束仅限制 NULL,不限制空字符串(
'');若需禁止空字符串,需结合检查约束(check(name != ''));
- 非空约束仅限制 NULL,不限制空字符串(
- 检查约束的版本兼容 :
- MySQL 8.0.16 以下版本写
CHECK语法不会报错,但约束不生效,需在代码层校验;
- MySQL 8.0.16 以下版本写
- 复合约束 :
- 单个字段可叠加多个约束(如
name字段的NOT NULL + UNIQUE),约束声明顺序不影响效果。
- 单个字段可叠加多个约束(如
四、图形化工具创建约束(DataGrip 示例)
对于不熟悉 SQL 语法的开发者,可通过图形化工具快速添加约束:
- 右键点击数据库 → 新建表 → 填写字段名和类型;
- 勾选约束选项:
- 主键:勾选
PRIMARY KEY+AUTO_INCREMENT; - 非空:勾选
NOT NULL; - 唯一:勾选
UNIQUE; - 默认值:在
Default Value栏输入(如'1'); - 检查约束:在
Check Constraints栏添加条件(如age > 0 and age <= 120);
- 主键:勾选
- 保存表结构,工具自动生成带约束的
CREATE TABLE语句。


五、小结:基础约束的核心价值
基础约束是单表数据质量的 "第一道防线",通过非空、唯一、主键等规则,能从源头避免大部分无效数据。下一篇我们将学习跨表约束的核心 ------ 外键约束,解决多表关联时的数据一致性问题!
结语
🍍 我是思成!若这篇内容帮你理清了 MySQL 基础约束的使用逻辑:
👀 【关注】跟我一起拆解 MySQL 核心知识点,从约束到表设计,吃透每一个数据安全规则
❤️ 【点赞】让技术干货被更多人看见,让抽象的约束规则变得易懂
⭐ 【收藏】把主键、唯一、非空约束的用法存好,表设计 / 面试时随时查阅
💬 【评论】分享你设计表时踩过的约束坑,或想深挖的约束知识点,一起交流进步
技术学习没有捷径,但找对思路能少走弯路~愿我们都能把抽象的约束规则,转化为可落地的表设计方案,一步步构建健壮的数据库体系!
