MySQL INSERT INTO SELECT时自增Id不连续问题及解决

 更新时间:2023年12月08日 16:10:19   作者:shyの同学  
这篇文章主要介绍了INSERT INTO SELECT时自增Id不连续问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

1.问题

最近笔者接到一个新的开发需求:

将多张相同字段的MySQL数据表合并为一张,一听我就乐了,这不就是几行INSERT INTO SELECT FROM…的事儿嘛。

在痛快的执行完准备交付的时候,发现了一个问题:

\qquad 合并好的数据表中的id居然不是连续自增的,也就是说合并的几张数据表中每两张表的Id中间没有续上。

合并前的数据是长这样的

合并好之后的数据是长这样的

可以发现4下来就是8了,11下来是15

2.分析

通过仔细的研究之后发现,对于批量插入数据语句,MySQL提供了批量申请自增id的策略:

  • 语句执行过程中,第一次申请自增id,会分配1个(2的0次方)
  • 1个用完以后,这个语句第二次申请自增id,会分配2个(2的1次方)
  • 2个用完以后,还是这个语句,第三次申请自增id,会分配4个(2的2次方)

也就是说当我执行下面这条语句时(user01一共四条数据)

INSERT INTO user (name, age) SELECT name, age from user01;
  • 第一次申请自增id会分配1个,1 < 4
  • 第二次申请自增id会分配2个,1+2 < 4
  • 第三次申请自增id会分配4个,1+2+4 > 4,终止

此时1 + 2 + 4 = 7 > 4,申请自增id的操作就会停止。

因为已经申请了7个id了,所以当我们执行第二条SQL语句时,插入数据的id就会从8开始,此时AUTO_INCREMENT的值也会是8

3.解决方案

笔者采用的操作是在Navicat中修改自动递增的值来保证它的id连续:

直接将自动递增的值删除,然后保存

当然,这个理论上是不能解决根本问题的。

4.结论

这么设计的主要原因是为了提升性能,所以自增id只保证是递增的,但不保证是连续的!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SQL查询语句优化的实用方法总结

    SQL查询语句优化的实用方法总结

    下面小编就为大家带来一篇SQL查询语句优化的实用方法总结。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • mysql中取出json字段的小技巧

    mysql中取出json字段的小技巧

    这篇文章主要介绍了mysql中取出json字段的小技巧,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Win10安装mysql8.0.15 winx64及连接服务器过程中遇到的问题

    Win10安装mysql8.0.15 winx64及连接服务器过程中遇到的问题

    这篇文章主要介绍了Win10安装mysql8.0.15 winx64及连接服务器过程中遇到的问题,本文通过图文并茂的形式给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • MySQL多层级结构-区域表使用树详解

    MySQL多层级结构-区域表使用树详解

    前面我们大概介绍了一下树结构表的基本使用。在我们项目中有好几块有用到多层级的概念。下面我们哪大家都比较熟悉的区域表来做演示
    2016-07-07
  • 虚拟主机MySQL数据库的备份与还原的方法

    虚拟主机MySQL数据库的备份与还原的方法

    虚拟主机MySQL数据库的备份与还原的方法...
    2007-07-07
  • mysql 8.0.12 简单安装教程

    mysql 8.0.12 简单安装教程

    这篇文章主要为大家详细介绍了mysql 8.0.12 简单安装教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • MySQL中的多表查询与事务操作

    MySQL中的多表查询与事务操作

    这篇文章主要介绍了MySQL中的多表查询与事务操作,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • Mysql主从复制与读写分离图文详解

    Mysql主从复制与读写分离图文详解

    这篇文章主要给大家介绍了关于Mysql主从复制与读写分离的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • MYSQL设置字段自动获取当前时间的sql语句

    MYSQL设置字段自动获取当前时间的sql语句

    整理数据库数据,看到好多表都有加create_time和 update_time字段,来记录数据插入的时间和更新时间,但是时间插入是通过代码来维护的,这篇文章主要介绍了MYSQL设置字段自动获取当前时间,需要的朋友可以参考下
    2023-07-07
  • mysql 5.7.19 二进制最新安装

    mysql 5.7.19 二进制最新安装

    这篇文章主要介绍了mysql 5.7.19 二进制最新安装的相关资料,需要的朋友可以参考下
    2017-10-10

最新评论