MySQL约束:6大核心机制详解

MySQL 约束是用于限制表中数据规则 的机制,核心作用是保证数据的准确性、完整性、一致性,防止非法 / 无效数据存入数据库。

简单说:约束就是给数据表定规矩,不符合规矩的数据无法插入 / 修改。


一、约束的分类

1. 按作用范围

  • 列级约束:直接写在列定义后面,只对当前列生效
  • 表级约束:写在所有列定义之后,可对多列生效

2. 6 大核心约束(必掌握)

表格

约束名称 关键字 作用
非空约束 NOT NULL 列的值不能为空
唯一约束 UNIQUE 列的值不能重复,可以为 NULL
主键约束 PRIMARY KEY 非空 + 唯一,表的唯一标识(一张表只能有一个主键)
外键约束 FOREIGN KEY 建立多表关联,保证引用完整性
默认约束 DEFAULT 给列设置默认值,未赋值时自动填充
检查约束 CHECK 自定义条件限制值的范围(MySQL 8.0 + 生效)

二、逐类详解 + 实战代码

1. 非空约束 (NOT NULL)

强制列必须有值 ,不能为 NULL

sql

复制代码
-- 创建用户表,用户名、密码不能为空
CREATE TABLE user (
    id INT,
    username VARCHAR(20) NOT NULL, -- 列级非空约束
    password VARCHAR(20) NOT NULL
);

✅ 插入时必须给 usernamepassword 赋值,否则报错。


2. 唯一约束 (UNIQUE)

保证列中所有数据互不重复 ,可以为 NULL(NULL 不算重复)。

sql

复制代码
CREATE TABLE user (
    id INT,
    phone VARCHAR(11) UNIQUE, -- 手机号唯一
    email VARCHAR(30) UNIQUE
);

✅ 两个用户不能有相同的手机号 / 邮箱。


3. 主键约束 (PRIMARY KEY)

非空 + 唯一 ,是表中每一行数据的唯一标识 ,一张表只能有一个主键

(1)单列主键

sql

复制代码
CREATE TABLE user (
    id INT PRIMARY KEY, -- 主键
    username VARCHAR(20) NOT NULL
);
(2)联合主键(多列组合唯一)

sql

复制代码
CREATE TABLE score (
    stu_id INT,
    course_id INT,
    score INT,
    PRIMARY KEY (stu_id, course_id) -- 表级约束:学生+课程组合唯一
);
(3)主键自增 (AUTO_INCREMENT)

配合主键使用,自动生成连续数字,仅适用于整数类型主键

sql

复制代码
CREATE TABLE user (
    id INT PRIMARY KEY AUTO_INCREMENT, -- 自动增长
    username VARCHAR(20) NOT NULL
);

✅ 插入数据时不用给 id 赋值,数据库自动生成。


4. 默认约束 (DEFAULT)

当插入数据未指定该列值时,自动使用设置的默认值。

sql

复制代码
CREATE TABLE user (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(20) NOT NULL,
    status INT DEFAULT 1 -- 默认状态为1(正常)
);

✅ 插入时不写 status,自动存入 1


5. 检查约束 (CHECK)

自定义条件限制数据范围(MySQL 8.0.16 及以上版本完全支持)。

sql

复制代码
CREATE TABLE student (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    age INT CHECK (age >= 18 AND age <= 60), -- 年龄必须18-60岁
    gender CHAR(1) CHECK (gender IN ('男','女'))
);

✅ 插入年龄 < 18 或性别不是男女的数据会直接报错。


6. 外键约束 (FOREIGN KEY)

用于建立两张表之间的关联关系,保证数据的引用完整性。

  • 主表:被引用的表(如部门表)
  • 从表:引用主表的表(如员工表)

规则:从表外键的值,必须在主表主键中存在。

sql

复制代码
-- 1. 先创建主表:部门表
CREATE TABLE dept (
    dept_id INT PRIMARY KEY AUTO_INCREMENT,
    dept_name VARCHAR(20) NOT NULL UNIQUE
);

-- 2. 创建从表:员工表(添加外键关联部门表)
CREATE TABLE emp (
    emp_id INT PRIMARY KEY AUTO_INCREMENT,
    emp_name VARCHAR(20) NOT NULL,
    dept_id INT,
    -- 外键约束:emp表的dept_id 关联 dept表的dept_id
    FOREIGN KEY (dept_id) REFERENCES dept(dept_id)
);

✅ 员工表的部门编号,必须是部门表中已存在的编号。


三、完整综合示例(一张表包含所有约束)

sql

复制代码
CREATE TABLE student (
    -- 主键+自增
    id INT PRIMARY KEY AUTO_INCREMENT,
    -- 非空
    name VARCHAR(20) NOT NULL,
    -- 唯一
    id_card VARCHAR(18) UNIQUE NOT NULL,
    -- 检查约束
    age INT CHECK (age >= 16),
    -- 默认约束
    gender CHAR(2) DEFAULT '未知',
    -- 外键(关联班级表)
    class_id INT,
    FOREIGN KEY (class_id) REFERENCES class(class_id)
);

四、约束常用操作

1. 添加约束

sql

复制代码
-- 给已有表添加非空约束
ALTER TABLE user MODIFY username VARCHAR(20) NOT NULL;

-- 添加主键
ALTER TABLE user ADD PRIMARY KEY (id);

-- 添加外键
ALTER TABLE emp ADD FOREIGN KEY (dept_id) REFERENCES dept(dept_id);

2. 删除约束

sql

复制代码
-- 删除主键
ALTER TABLE user DROP PRIMARY KEY;

-- 删除外键(需先查看外键名)
ALTER TABLE emp DROP FOREIGN KEY 外键名;

总结

  1. 约束是 MySQL 数据安全的核心,用来保证数据不混乱、不错误
  2. 6 大核心:NOT NULLUNIQUEPRIMARY KEYFOREIGN KEYDEFAULTCHECK
  3. 主键:唯一标识,非空唯一,一张表一个
  4. 外键:关联多表,保证数据引用正确
  5. 自增:配合主键使用,自动生成唯一数字
相关推荐
不会写DN4 小时前
GORM 实战入门:从环境搭建到企业级常用特性全解析
sql·mysql·go·gin
gjc5929 小时前
如何写好SQL:企业内训文档
数据库·sql
代码派11 小时前
SQL 审核解决了部分问题,另一部分是慢 SQL 治理
数据库·sql·mysql·数据库管理工具·ninedata·sql审核·sql治理
qq_3660862211 小时前
MyBatis 动态 SQL 高频性能优化方案
sql·性能优化·mybatis
不会编程的崽12 小时前
ShowCtf Web14 --不会编程的崽
sql·web
麦聪聊数据12 小时前
基于 SQL2API 架构快速发布 RESTful 接口
数据库·后端·sql·低代码·restful
麦聪聊数据14 小时前
从“手动跑数”到“数据超市”,企业内部 API 权限管控与双轨分发架构解析
数据库·sql·低代码·restful
电商API&Tina14 小时前
主流跨境平台多站点 API 接入流程:淘宝天猫京东API接口
java·大数据·网络·数据库·人工智能·sql·json
果果燕14 小时前
SQLite3数据库学习笔记1
数据库·sql·oracle