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
);
✅ 插入时必须给 username 和 password 赋值,否则报错。
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 外键名;
总结
- 约束是 MySQL 数据安全的核心,用来保证数据不混乱、不错误
- 6 大核心:
NOT NULL、UNIQUE、PRIMARY KEY、FOREIGN KEY、DEFAULT、CHECK - 主键:唯一标识,非空唯一,一张表一个
- 外键:关联多表,保证数据引用正确
- 自增:配合主键使用,自动生成唯一数字