【MySQL 零基础入门】MySQL 约束精讲(一):基础约束篇

是思成呀:个人主页

个人专栏《C++知识总结》《MySQL 零基础入门到实战》


引言:

在数据库设计中,约束是保障数据质量的核心机制 ------ 它能强制限制表中字段的存储规则,避免无效、重复或不一致的数据进入数据库。本文先从非空、唯一、主键、默认、检查这五类基础约束入手,结合实战案例拆解用法!

目录

[一、约束概述:数据库的 "数据规则守护者"](#一、约束概述:数据库的 “数据规则守护者”)

[1. 约束的定义与目的](#1. 约束的定义与目的)

[2. 约束的分类(基础篇)](#2. 约束的分类(基础篇))

二、基础约束实战:创建用户表并验证约束

[1. 创建带约束的用户表](#1. 创建带约束的用户表)

[2. 各类约束的效果验证](#2. 各类约束的效果验证)

[(1)主键约束:唯一标识 + 自增](#(1)主键约束:唯一标识 + 自增)

(2)非空约束:必填字段不可空

(3)唯一约束:字段值不可重复

(4)默认约束:未赋值时自动填充

(5)检查约束:字段值满足条件

三、基础约束的核心易错点

[四、图形化工具创建约束(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,自动生成连续值:

    sql 复制代码
    insert 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 或 NULL id 均报错:

    sql 复制代码
    insert into user(id, name, age) values(1, '王五', 30);  -- 报错:Duplicate entry '1' for key 'PRIMARY'
  • 注意 :插入失败的操作会消耗自增值(如上述报错后,下一条插入的 id 会是 3,而非 2)。

(2)非空约束:必填字段不可空

  • 验证 :插入 name 为 NULL 的数据,直接报错:

    sql 复制代码
    insert into user(name, age) values(null, 22);  -- 报错:Column 'name' cannot be null

(3)唯一约束:字段值不可重复

  • 特性:唯一约束允许 NULL 值(多个 NULL 不视为重复),但非 NULL 值必须唯一;

  • 验证 1 :插入重复 name 报错:

    sql 复制代码
    insert into user(name, age) values('张三', 30);  -- 报错:Duplicate entry '张三' for key 'name'
  • 验证 2 :插入多个 NULL email 正常:

    sql 复制代码
    insert into user(name, age, email) values('王五', 28, null);
    insert into user(name, age, email) values('赵六', 32, null);  -- 成功,NULL 不触发唯一约束

(4)默认约束:未赋值时自动填充

  • 验证 :插入数据时不指定 status,自动填充默认值 1

    sql 复制代码
    insert into user(name, age) values('孙七', 26);
    select name, status from user where name = '孙七';  -- 结果:孙七 | 1
  • 覆盖默认值 :显式指定 status 时,以指定值为准:

    sql 复制代码
    insert into user(name, age, status) values('周八', 29, '0');
    select name, status from user where name = '周八';  -- 结果:周八 | 0

(5)检查约束:字段值满足条件

  • 注意:MySQL 8.0.16 及以上版本支持检查约束,低版本会忽略该约束;

  • 验证 :插入年龄为负数或超过 120,报错:

    sql 复制代码
    insert into user(name, age) values('吴九', -5);  -- 报错:Check constraint 'user_chk_1' is violated
    insert into user(name, age) values('郑十', 121);  -- 报错:同上

三、基础约束的核心易错点

  1. 主键 vs 唯一约束
    • 主键:每张表只能有一个,非空且唯一,自动创建索引;
    • 唯一约束:每张表可多个,允许 NULL,同样创建索引;
  2. NULL vs 空字符串
    • 非空约束仅限制 NULL,不限制空字符串('');若需禁止空字符串,需结合检查约束(check(name != ''));
  3. 检查约束的版本兼容
    • MySQL 8.0.16 以下版本写 CHECK 语法不会报错,但约束不生效,需在代码层校验;
  4. 复合约束
    • 单个字段可叠加多个约束(如 name 字段的 NOT NULL + UNIQUE),约束声明顺序不影响效果。

四、图形化工具创建约束(DataGrip 示例)

对于不熟悉 SQL 语法的开发者,可通过图形化工具快速添加约束:

  1. 右键点击数据库 → 新建表 → 填写字段名和类型;
  2. 勾选约束选项:
    • 主键:勾选 PRIMARY KEY + AUTO_INCREMENT
    • 非空:勾选 NOT NULL
    • 唯一:勾选 UNIQUE
    • 默认值:在 Default Value 栏输入(如 '1');
    • 检查约束:在 Check Constraints 栏添加条件(如 age > 0 and age <= 120);
  3. 保存表结构,工具自动生成带约束的 CREATE TABLE 语句。

五、小结:基础约束的核心价值

基础约束是单表数据质量的 "第一道防线",通过非空、唯一、主键等规则,能从源头避免大部分无效数据。下一篇我们将学习跨表约束的核心 ------ 外键约束,解决多表关联时的数据一致性问题!

结语

🍍 我是思成!若这篇内容帮你理清了 MySQL 基础约束的使用逻辑:

👀 【关注】跟我一起拆解 MySQL 核心知识点,从约束到表设计,吃透每一个数据安全规则

❤️ 【点赞】让技术干货被更多人看见,让抽象的约束规则变得易懂

⭐ 【收藏】把主键、唯一、非空约束的用法存好,表设计 / 面试时随时查阅

💬 【评论】分享你设计表时踩过的约束坑,或想深挖的约束知识点,一起交流进步

技术学习没有捷径,但找对思路能少走弯路~愿我们都能把抽象的约束规则,转化为可落地的表设计方案,一步步构建健壮的数据库体系!

相关推荐
小黄人软件2 小时前
【过度滥用眼】真正的理解,从闭眼开始:如何把“眼睛视觉依赖”降到最低,把大脑效率提到最高。【最少用眼的工作与学习体系】
学习
ActionTech2 小时前
SCALE | SQLFlash 在 SQL 优化维度上的表现评估
数据库·sql
老华带你飞3 小时前
建筑材料管理|基于springboot 建筑材料管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·学习·spring
逐梦吧!旅行者3 小时前
Linux MySQL 5.7用户管理与用户密码的设置问题
linux·mysql
L.fountain3 小时前
图像自回归生成(Auto-regressive image generation)实战学习(一)
人工智能·深度学习·学习·计算机视觉·图像自回归
WizLC3 小时前
【JAVA】JVM类加载器知识笔记
java·jvm·笔记
TL滕3 小时前
从0开始学算法——第十八天(分治算法练习)
笔记·学习·算法
NaiLuo_454 小时前
MySQL基本查询
数据库·mysql
刺客xs4 小时前
MYSQL数据库------多表查询
数据库·mysql