一、自增长
auto_increment是自动为数字字段生成唯一值的约束,通常与主键搭配使用,作为逻辑主键(与业务无关的唯一标识),其核心特性为:
- 自增长字段必须是索引(key 一栏有值,主键本身是索引,因此可直接搭配);
- 自增长字段必须是整数类型;
- 一张表最多只能有一个自增长字段;
- 插入数据时不给自增长字段赋值,会自动被系统触发,系统会从当前最大值 + 1 生成新值。
案例:

查找建表描述:



我们可以看到,当插入数据时指定id为1000 , 系统的自增值的起始位值会变化:

指定id插入数据到表中,如果合法,会自动插入数据;再次select * from t8 时候,表格以升序把数据整理好 , 但是auto_increment 还是当前表中的最大值 + 1

可以在建表的时候,指定表的自增值,如下:

在插入后获取上一次的AUTO_INCREMENT的值(批量插入获取的是第一个值)


一本书的目录 , 他所存在的价值就是 , 快速查找内容 ;可以目录存在多页,虽然牺牲了很多纸张 , 但是提高了我们查找某一个章节的速度 。
同样的 , 如果数据库的表过于大 , 我们可以再开辟一段空间 , 维护内容 与 数据页码之间的关系
索引它是用空间换取时间
二、唯一键
实际业务中,一张表往往有多个字段需要唯一性约束 ,但主键只能有一个,此时可通过
unique key实现,其核心特性为:
- 唯一键字段不能重复 ,但允许为空,且多个空值不做唯一性比较;
- 一张表可以有多个唯一键;
- 主键侧重标识记录的唯一性 ,唯一键侧重保证业务字段的唯一性。
- 主键和唯一键是互相补充的。一张表只能有一个主键 ,但可以有多个唯一键。因此,唯一键是对主键的补充,用于约束其他需要唯一性的字段。
我们先来看一下unique :

当插入id值相同的时候 ,unqiue属性约束了插入数据id不可重复,则拒绝插入数据

唯一键的值可以为NULL

为了更加深刻的理解unique这个约束的意义,再来举一个例子:


这个完全就属于数据库设计不好的例子了,在实际的生活中, 不同的人,拿着身份证,申请的号码是唯一的,不重复的 ;唯一键是保证业务字段唯一性的重要手段,它帮助我们将业务规则下沉到数据库层面,让数据存储自身具备校验能力,避免因应用层疏忽导致的数据混乱。在设计表结构时,凡是业务上要求唯一的字段(如手机号、邮箱、身份证号等),都应考虑使用唯一键进行约束。
修正:


主键与唯一键的区别
| 特性 | 主键(primary key) | 唯一键(unique key) |
|---|---|---|
| 唯一性 | 唯一 | 唯一 |
| 非空性 | 必须非空 | 允许为空 |
| 数量限制 | 一张表一个 | 一张表多个 |
| 核心作用 | 标识记录唯一性 | 保证业务字段唯一性 |
一个保证记录唯一性,一个保证业务逻辑上的唯一性 (主键只能有一个~)
三、外键
**谈一个概念:**生活中如果有一张表,表中的数据不是孤立的,可能与其他表有关系,我们的MYSQL是关系型数据库,所以表与表之间存在一定的关系 , 所以表与表之间需要存在约束来规范
外键是用于 定义主表和从表之间关联关系的约束,能保证从表的数据与主表的一致性,解决数据冗余和数据不一致问题,其核心特性为:
- 外键约束定义在从表上,主表必须有主键或唯一键;
- 从表的外键字段值必须在主表的主键 / 唯一键中存在,或为 null;
- 建立外键的本质:将表之间的关联关系交给 MySQL 审核,拒绝插入不符合业务逻辑的数据。
语法:
FOREIGN KEY (从表字段) REFERENCES 主表(主表字段)

案例:
学生表:从表

班级表:主表
- 外键:需要考虑表与表之间的关联关系
- 关联
- 约束


以下两个场景是不符合实际情况的例子:


MYSQL需要在技术层面上,规避这种不合理的情况发生 。 修改从表,设置外键


当试图插入一个不存在的班级编号时,数据库会报错,从而保证了数据的有效性。建立外键的本质其实就是把相关性交给mysql去审核了,提前告诉mysql表之间的约束关系,那么当用户插入不符合业务逻辑的数据的时候,mysql不允许你插入。
四、综合案例 - 阅读
学习了所有约束后,我们结合商店购物的实际业务场景,设计商品、客户、购买三张表,综合运用上述所有约束,实现数据的完整性和逻辑性保障。

业务需求
-
包含商品表、客户表、购买表,表之间通过外键关联;
-
每张表设置自增长主键;
-
客户姓名不能为空,邮箱和身份证号唯一;
-
客户性别仅允许 "男 / 女";
-
商品名、供应商不能为空,单价默认 0;
-
购买数量默认 0,关联的客户 ID 和商品 ID 必须存在。
-- 1. 创建数据库,指定字符集
create database if not exists bit32mall
default character set utf8 ;
-- 2. 选择数据库
use bit32mall;-- 3. 创建商品表(主表)
create table if not exists goods
(
goods_id int primary key auto_increment comment '商品编号',
goods_name varchar(32) not null comment '商品名称',
unitprice int not null default 0 comment '单价,单位分',
category varchar(12) comment '商品分类',
provider varchar(64) not null comment '供应商名称'
);-- 4. 创建客户表(主表)
create table if not exists customer
(
customer_id int primary key auto_increment comment '客户编号',
name varchar(32) not null comment '客户姓名',
address varchar(256) comment '客户地址',
email varchar(64) unique key comment '电子邮箱,唯一',
sex enum('男','女') not null comment '性别,仅允许男/女',
card_id char(18) unique key comment '身份证号,唯一'
);-- 5. 创建购买表(从表),外键关联客户表和商品表
create table if not exists purchase
(
order_id int primary key auto_increment comment '订单号',
customer_id int comment '客户编号',
goods_id int comment '商品编号',
nums int default 0 comment '购买数量',
-- 外键关联客户表
foreign key (customer_id) references customer(customer_id),
-- 外键关联商品表
foreign key (goods_id) references goods(goods_id)
);



MySQL 的表约束是保障数据质量的核心手段,不同约束各司其职,从基础到核心形成了完整的约束体系:
- 基础约束:null/not null(非空)、default(默认值)、comment(注释)、zerofill(零填充),完善字段的基本属性;
- 唯一性约束:primary key(主键)、unique key(唯一键)、auto_increment(自增长),保证表内数据的唯一性;
- 关联性约束:foreign key(外键),保证表之间数据的一致性,解决数据冗余和脏数据问题。
