mysql常用约束

什么是约束

在 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 默认当前时间
相关推荐
数据库小学妹13 小时前
数据库选型实战:从数据类型到TCO成本,五维决策框架+九款产品横评
数据库·信创·国产数据库·数据库选型·oracle迁移
龙仔72514 小时前
人大金仓 KingbaseES V8 只读账号创建完整运维笔记
运维·笔记·sql·人大金仓
神龙天舞200114 小时前
MySQL 备库为什么会延迟好几个小时
android·数据库·mysql
丙氨酸長鏈15 小时前
Web前端入门第 问:JavaScript 一个简单的 IndexedDB 数据库入门示例
前端·javascript·数据库
独行侠影a16 小时前
APScheduler+Redis 分布式定时任务:解决多实例任务重复执行
数据库·redis·分布式
传说故事16 小时前
数据库中一些常用英文单词含义
数据库·oracle
夏贰四17 小时前
中小企业搭建业务中台如何控成本?业务中台轻量化落地分几步实施?
数据库·业务中台
林焱RPA17 小时前
影刀RPA200篇纪念版:最实用的20个自动化场景大盘点
数据库
名字还没想好☜17 小时前
Go 的 time.After 在 select 循环里内存泄漏:定时器堆积原理与 timer.Reset 正确姿势
java·数据库·golang·go·goroutine
每天都要进步哦19 小时前
SQL单行函数详解:字符、数字、日期、转换与通用函数全解析
数据库·mysql