什么是约束
在 MySQL 里,约束(Constraint)用来限制表中数据的有效性和完整性。
约束保证了数据的合法性,防止脏数据进入数据库。
常见约束包括:
- 主键约束(PRIMARY KEY)
- 唯一约束(UNIQUE)
- 非空约束(NOT NULL)
- 默认值(DEFAULT)
- 外键约束(FOREIGN KEY)
- 自动递增(AUTO_INCREMENT)
- 检查约束(CHECK)
一、主键约束 PRIMARY KEY
- 唯一标识表中的每一条记录
- 不允许重复,也不能为空
示例:
sql
CREATE TABLE student(
id INT PRIMARY KEY,
name VARCHAR(20),
age TINYINT
);
特点:
- 每张表通常只有一个主键
- 主键列默认隐含 NOT NULL
二、唯一约束 UNIQUE
- 保证列的值唯一
- 可以有多个唯一约束列
示例:
sql
CREATE TABLE user(
id INT PRIMARY KEY,
username VARCHAR(30) UNIQUE,
email VARCHAR(50) UNIQUE
);
说明:
- username、email 都不允许重复
- 但可以为空(如果不加 NOT NULL)
三、非空约束 NOT NULL
- 不允许字段为 NULL
- 确保每条记录都有值
示例:
sql
CREATE TABLE student(
id INT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
age TINYINT
);
说明:
- name 字段不能为空
- age 可以为空
四、默认值 DEFAULT
- 给字段设置默认值
- 插入数据时如果不写该字段,则使用默认值
示例:
sql
CREATE TABLE student(
id INT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
age TINYINT DEFAULT 18
);
说明:
- age 没有指定值时,自动为 18
五、自动递增 AUTO_INCREMENT
- 常用在主键列
- 每插入一条记录自动加 1
示例:
sql
CREATE TABLE student(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL
);
说明:
- 插入数据时不写 id,系统会自动生成
- 通常配合主键一起使用
六、外键约束 FOREIGN KEY
- 用于保证表之间的数据一致性
- 一张表的字段引用另一张表的主键
示例:
sql
CREATE TABLE class(
id INT PRIMARY KEY,
name VARCHAR(20)
);
CREATE TABLE student(
id INT PRIMARY KEY,
name VARCHAR(20),
class_id INT,
FOREIGN KEY (class_id) REFERENCES class(id)
);
说明:
- student.class_id 必须存在于 class.id
- 防止出现没有对应班级的学生
七、检查约束 CHECK
- 用于限制字段值的范围
- MySQL 8.0+ 才完全支持
示例:
sql
CREATE TABLE student(
id INT PRIMARY KEY,
name VARCHAR(20),
age TINYINT CHECK(age BETWEEN 0 AND 120)
);
说明:
- age 必须在 0~120 之间
- 不符合条件的插入会报错
八、约束总结
| 约束 | 用途 | 常用场景 |
|---|---|---|
| PRIMARY KEY | 主键唯一且不为空 | 表唯一标识 |
| UNIQUE | 保证字段值唯一 | 用户名、邮箱 |
| NOT NULL | 字段不能为空 | 必填字段 |
| DEFAULT | 默认值 | 插入数据时未指定字段 |
| AUTO_INCREMENT | 自动递增 | 主键自增 |
| FOREIGN KEY | 外键约束 | 表关联 |
| CHECK | 数据有效性限制 | 数值范围、枚举等 |
建表常用组合示例
sql
CREATE TABLE user(
id BIGINT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(30) NOT NULL UNIQUE,
password VARCHAR(100) NOT NULL,
email VARCHAR(50) UNIQUE,
age TINYINT DEFAULT 18,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
说明:
- 主键 id 自动递增
- username 不允许为空且唯一
- email 唯一
- age 默认 18
- create_time 默认当前时间