千家信息网

关于MySQL自增ID的一些小问题总结

发表于:2024-11-11 作者:千家信息网编辑
千家信息网最后更新 2024年11月11日,下面这几个小问题都是基于 InnoDB 存储引擎的。1. ID最大的记录删除后,新插入的记录ID是什么例如当前表中有ID为1,2,3三条记录,把3删除,新插入记录的ID从哪儿开始?答案: 从4开始。实
千家信息网最后更新 2024年11月11日关于MySQL自增ID的一些小问题总结

下面这几个小问题都是基于 InnoDB 存储引擎的。

1. ID最大的记录删除后,新插入的记录ID是什么

例如当前表中有ID为1,2,3三条记录,把3删除,新插入记录的ID从哪儿开始?

答案: 从4开始。

实验

创建表 tb0,ID自增:

create table tb0(id int unsigned auto_increment primary key);

插入3条记录:

insert into tb0 values(null);

删除ID为3的记录:

delete from tb0 where id=3

查看当前自增值:

show create table tb0;# 结果CREATE TABLE `tb0` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1

自增ID为4,删除ID最大的记录并不影响自增ID的值。

2. MySQL 重启后自增ID从哪儿开始

例如当前表中有ID为1,2,3三条记录,把3删除,重启MySQL,新插入记录的ID从哪儿开始?

很多人会认为从4开始,实际是从3开始。

因为InnoDB的自增值是记录在内存的,不是记录在数据文件的。

重启后,会把 当前最大ID + 1 作为起始值。

实验

创建表 tb1,ID自增:

create table tb1(id int unsigned auto_increment primary key);

添加3条数据记录:

insert into tb1 values(null);

删除ID为3的记录:

delete from tb1 where id=3

通过上一个问题,我们知道,此时自增ID值为4。

重启MySQL。

查看当前的自增值:

show create table tb1;# 结果CREATE TABLE `tb1` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1

3. 手动插入ID后,下次插入时自增值是多少

例如当前的自增ID为4,新插入记录时,手动指定ID为10,下次使用自增方式插入时,ID是 11。

ID自增值 = 当前最大ID + 1

在插入新记录时,就已经计算得出了新的ID值

实验

创建表 tb2,ID自增:

create table tb2(id int unsigned auto_increment primary key);

添加记录:

insert into tb2 values(null);

手动指定ID:

insert into tb2 values(4294967000);

查看当前的自增值:

show create table tb2;# 结果CREATE TABLE `tb2` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4294967001 DEFAULT CHARSET=latin1

可以看到自增值变为 4294967001。

4. 自增值用完后怎么办

无符号 int 的最大值为 4294967295,自增值达到此值后,就不变了,新插入记录时就会报错:

Duplicate entry '4294967295' for key 'PRIMARY'

如果表记录经常插入、删除,即使表内记录总量不是很大,ID也可能快速用完,这种情况可以需要使用 bigint。

int 取值范围:

int 是 4 byte,首位用来表示符号

有符号的范围:
从 - 至 - 1

(-2147483648 至 2147483647)

无符号的范围:
0 至 - 1

(0 至 4294967295)

bigint 取值范围:

int 是 8 byte

有符号的范围:
从 - 至 - 1

(-9223372036854775808 至 9223372036854775807)

无符号的范围:
0 至 - 1

(0 至 18446744073709551615)

小结

通过实验可以发现InnoDB中自增ID的一些特性:

插入新记录时,就会计算出新的自增值(最大ID+1),不管是使用自动ID,还是手动指定一个ID。

删除最大ID值对自增ID值没有影响,但MySQL重启之后有影响,不会使用之前的自增ID值,而是使用最大ID+1,因为自增ID值是存在内存中,重启后需要重新计算。

自增ID用完后就不变了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。

增值 最大 符号 范围 手动 实验 结果 影响 问题 内存 内容 数据 新记录 三条 学习 很大 价值 会计 实际 小结 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 中国网络技术人才多吗 寻欢人气协议软件开发 sql数据库找不到本地服务器 数据库咋连接的 linux服务器推荐 信息化素养与网络安全宣传周 大学数据库系统期末考试题 武汉公安局网络安全监察部 台服魔兽服务器状态 违反规定服务器被停封 对比两个地理数据库图层数量 微信服务器会存朋友圈视频吗 geo数据库怎么挖 如何在混乱服务器中生存下去 软件开发招聘兰州 数据库查询数量关键字 深圳手边网络技术有限公司 在多媒体软件开发中 升级服务器怎么连接电脑 河南电脑软件开发机构 上海海天网络技术有限公司 数据库默认账号密码 网络安全保护失败原因 试卷导入数据库MySQL 服务器取消关机计划 旗委网络安全和信息化委员会议 软件开发工程师年终总结展望 网络安全法案例试题及答案 游戏登录器获取不到服务器列表 国诚互联网络科技有限公司
0