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 默认当前时间
相关推荐
SelectDB10 分钟前
快手基于 Apache Doris 千亿多模态检索的实践
大数据·数据库·数据分析
SelectDB16 分钟前
StarRocks 迁移至 Apache Doris 完整指南:三步完成结构、数据与业务平滑切换
大数据·数据库·数据分析
这个DBA有点耶16 分钟前
InnoDB索引组织表下,复合主键和自增主键的物理存储差异与选型对比
数据库·mysql·架构
李少兄32 分钟前
数据库批量清理前置防御:如何严谨校验目标表是否存在
mysql
香吧香35 分钟前
Docker Swarm 线上环境 MariaDB XA 悬停事务故障排查
mysql·异常
其实防守也摸鱼1 小时前
常见安全架构中 Shiro 的认证确认机制解析
运维·服务器·数据库·windows·github
小白男神1 小时前
MySQL进阶学习三(视图)
后端·mysql
TDengine (老段)2 小时前
TDengine 常见问题 TOP7
大数据·数据库·时序数据库·常见问题·tdengine·涛思数据
+VX:Fegn08952 小时前
计算机毕业设计|基于java+ vue共享单车信息系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
mysqloffice2 小时前
数智时代,核心系统数据库架构往哪走
数据库·人工智能