mysql 约束

学习 MySQL 的约束 (Constraint) ,最直观的理解就是:它是数据库的"安检员"或"规则守护者"

如果没有约束,你的 emp 表可能会出现:两个员工工号一样、年龄是负数、或者入职日期是 3000 年。约束的存在,就是为了保证数据的完整性、一致性和有效性


1. 什么是约束?

约束是作用于表中字段上的规则。

  • 目的:限制存储在表中的数据,确保数据的正确。

  • 时机 :在创建表(CREATE TABLE)或修改表(ALTER TABLE)时添加。


2. 常见的六种约束(由浅入深)

我们可以结合你的 emp 表,看看这些规则是如何保护数据的:

约束关键字 中文名称 描述 场景举例 (基于你的 emp 表)
NOT NULL 非空约束 限制该字段的数据不能为 NULL 姓名 (name) 必须填写,不能是空的。
UNIQUE 唯一约束 保证该字段的所有数据都是唯一的 身份证号 (idcard) 不能重复。
PRIMARY KEY 主键约束 主键是一行数据的唯一标识,非空且唯一 你的 id 字段,它是每个人的"身份证"。
DEFAULT 默认约束 保存数据时,若未指定值,则使用默认值 workaddress 如果不填,默认是"上海"。
CHECK 检查约束 保证字段值满足某一个条件 (8.0版本支持) age 必须在 0 到 120 岁之间。
FOREIGN KEY 外键约束 让两张表的数据建立连接,保证数据一致性 员工所属的"部门ID"必须在部门表里存在。

逐个精讲(由浅入深 + 例子)

🔴 1. 非空约束 NOT NULL

定义

规定:这个字段必须填值,不能为空(NULL)

用来干嘛

防止关键信息空着:姓名、手机号、密码 不能为空

复制代码
CREATE TABLE student(
    id INT,
    name VARCHAR(20) NOT NULL  -- 姓名不能为空
);

❌ 错误:插数据不写 name

复制代码
INSERT INTO student(id) VALUES(1); -- 直接报错

✅ 正确:必须给 name 赋值

🟡 2. 唯一约束 UNIQUE

定义

规定:这个字段的值,整张表里不能重复

用来干嘛

手机号、身份证、邮箱 ------ 每个人只能有一个

复制代码
CREATE TABLE student(
    id INT,
    phone VARCHAR(11) UNIQUE  -- 手机号不能重复
);

🟢 3. 默认值约束 DEFAULT

定义

不填这个字段时,自动给一个默认值

用来干嘛

性别默认未知、地址默认保密、创建时间默认当前时间

复制代码
CREATE TABLE student(
    id INT,
    name VARCHAR(20),
    gender VARCHAR(10) DEFAULT '未知'
);

插入不写性别:

sql

复制代码
INSERT INTO student(id,name) VALUES(1,'Tom');

自动变成:性别 = 未知

🔵 4. 主键约束 PRIMARY KEY(最重要!)

定义

  1. 一张表只能有一个主键
  2. 主键:非空 + 唯一 双重保证
  3. 用来唯一标识每一行数据

用来干嘛

精准找到某一条数据(学号、员工 ID、订单 ID)

例子

sql

复制代码
CREATE TABLE student(
    id INT PRIMARY KEY,  -- 主键:不空、不重复
    name VARCHAR(20) NOT NULL
);
  • id 不能空
  • id 不能重复
  • 通过 id 就能精准定位一个学生

🟣 5. 自增约束 AUTO_INCREMENT(配合主键)

定义

主键数字不用自己填,数据库自动往上加 1、2、3...

用来干嘛

新增数据不用管 ID,系统自动排号

例子

sql

复制代码
CREATE TABLE student(
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL
);

插入数据:

sql

复制代码
INSERT INTO student(name) VALUES('Tom'),('Rose');

id 自动变成:1、2、3......

🟠 6. 检查约束 CHECK(限制范围)

定义

规定字段值必须在某个范围里

用来干嘛

成绩只能 0~100年龄不能负数

例子

sql

复制代码
CREATE TABLE score(
    id INT PRIMARY KEY AUTO_INCREMENT,
    math INT CHECK(math >=0 AND math <=100)
);

❌ 插数学成绩 105 → 直接报错

⚫ 7. 外键约束 FOREIGN KEY(进阶)

定义

两张表绑在一起,子表数据必须依赖主表

外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。

用来干嘛

成绩表的学生 ID,必须在学生表里真实存在防止出现 "不存在学生的成绩"

简单例子

主表:student(学生)子表:score(成绩)成绩表里 student_id 必须来自 student 的 id

复制代码
CREATE TABLE student(
    id INT PRIMARY KEY AUTO_INCREMENT,   -- 主键 + 自增
    name VARCHAR(20) NOT NULL,           -- 非空
    phone VARCHAR(11) UNIQUE,            -- 唯一
    gender VARCHAR(10) DEFAULT '未知',   -- 默认值
    age INT CHECK(age>0)                 -- 检查约束
);
约束 作用 口诀
NOT NULL 不能为空 必填项
UNIQUE 不能重复 独一份
DEFAULT 不填给默认 自动补
PRIMARY KEY 非空 + 唯一,定位数据 身份证号
AUTO_INCREMENT 数字自动涨 自动排号
CHECK 限制范围 不乱填
FOREIGN KEY 两张表关联 绑在一起

3. 实战演练:创建一个带约束的表

假设我们要重新创建一张像你截图中那样的 emp 表,我们会这样写:

SQL

复制代码
CREATE TABLE emp (
    id INT PRIMARY KEY AUTO_INCREMENT,          -- 主键,且自动增长
    workno VARCHAR(10) NOT NULL UNIQUE,         -- 工号:不能为空且唯一
    name VARCHAR(10) NOT NULL,                  -- 姓名:不能为空
    gender CHAR(1) DEFAULT '男',                -- 性别:默认"男"
    age TINYINT CHECK (age > 0 AND age < 120),  -- 年龄:必须在0-120之间
    idcard CHAR(18) UNIQUE,                     -- 身份证:唯一
    entrydate DATE NOT NULL                     -- 入职日期:不能为空
);
相关推荐
ha_lydms7 分钟前
AnalyticDB基本概念
mysql·adb·analyticdb
摇滚侠42 分钟前
Spring 零基础入门到进阶 基于 XML 管理 Bean 14-28
xml·数据库·spring
Fanta丶44 分钟前
23.MySql group by优化、limit优化、 count优化、update优化
mysql
医疗信息化王工1 小时前
医院自律端系统——预警处置模块全栈实战(ASP.NET Core + Vue3 + Quartz 定时调度)
mysql·postgresql·vue·asp.net core·quartz
Metaphor6921 小时前
使用 Python 给 PDF 设置背景色或背景图
数据库·python·pdf
Gauss松鼠会1 小时前
【GaussDB】GaussDB重要通信参数汇总
服务器·网络·数据库·sql·性能优化·gaussdb·经验总结
睡不醒男孩0308231 小时前
第五篇:2026年企业级 PostgreSQL 高可用方案深度横评:Patroni vs. CLup 架构与可靠性全面对决
数据库·postgresql·架构
NineData1 小时前
SQL 都在等锁时,ChatDBA 先帮 MySQL 找到谁在挡路
数据库·人工智能·sql·mysql·安全·数据复制·数据迁移工具
神仙别闹1 小时前
基于 PHP + MySQL学生信息管理系统
android·mysql·php
超级无敌zhq1 小时前
后渗透痕迹清理:攻防对抗中的隐身术
网络·数据库·网络安全