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 默认当前时间
相关推荐
欢呼的太阳3 小时前
数据库设计Step by Step (10)——范式化
服务器·数据库·oracle
喜欢的名字被抢了4 小时前
MySQL基础入门:从零理解数据库与SQL
数据库·mysql·教程
Elastic 中国社区官方博客5 小时前
如何比较两个 Elasticsearch 索引并找出缺失的文档
大数据·运维·数据库·elasticsearch·搜索引擎
DLYSB_5 小时前
生命通道:如何用 HIS 医疗系统直连网络声光终端,打造“零延误”的危急值响应网关?
java·网络·数据库·报警灯
儒雅的大叔5 小时前
MySQL数据库InnoDB数据恢复工具使用总结
数据库·mysql·adb
观远数据6 小时前
ChatBI选型对比:从意图识别到SQL修复,六个维度打分决定是否值得投产
数据库·人工智能·sql
嘉&年华6 小时前
【第008篇】通过dexp和dimp命令导出和导入dmp文件(适用于达梦数据库)
数据库·sql
哥是强混7 小时前
Means:基于 .NET 10 打造的开源自部署 S3 兼容对象存储服务
网络·数据库·.net
ffqws_7 小时前
redis面试:如何保证双写一致
数据库·redis·缓存
水无痕simon8 小时前
6 数据库同义词
数据库