精华内容
下载资源
问答
  • mysql自动增长id不连续
    2022-07-18 09:41:24

    alter table tablename auto_increment = 1;
    这个命令不会改动现有的表的内容和顺序,同时新插入行的id会先使用已删除的id,完美填补空缺id。

    但这样按id排序就不一定是id大的写入时间晚了。

    对于表格内某些行删除之后,id不连续这个问题完全无法容忍,一开始使用
    TRUNCATE TABLE tablename
    来实现id从头自增,但是这个命令同时也会清空整个表 。

     不连续

    是因为mysql AUTO_INCREMENT有预分配,先申请,后使用,申请了没使用就跳了, 比如inser ignore 语句,因为有插入语句,所以一开始mysql就会给分配一个自增id,即便你没执行插入成功语句,下次再插入的时候就会调健 

    更多相关内容
  • 关于MySQL自增id不连续问题

    千次阅读 2022-01-18 16:20:00
    参考链接0:id不连续重排

    参考链接0:id不连续重排
    参考链接1:避免插入数据导致id不连续

    MySQL在navicat中设置唯一字段:

    索引(选择字段) >>> 索引类型(UNIQUE)

    当表中存在唯一字段,主键id自增时,插入新数据的时候唯一字段已存在,插入失败

    但此时id已自增+1,再次插入数据造成id不连续问题。

    -- 执行之后,不是表明将插入的id设置为1;而是设置插入id为表中id最大值+1。
     ALTER TABLE `table` AUTO_INCREMENT =1;

    在insert into 操作前 加上上述sql语句,将插入id设置为当前表中存在的id+1;

    展开全文
  • mysql 自增主键为什么不是连续的?

    千次阅读 2019-08-18 15:03:10
    目录 一 前言 二 自增值存储说明 三 自增值修改机制 ... 提出这个问题,是因为在工作中发现 mysql 中的 user 表的 id 默认是自增的,但是数据库存储的结果却不是连续的。 user 表结构: CREAT...

    目录

    一 前言

    二 自增值存储说明

    三 自增值修改机制

    四 自增值修改时机

    五 导致自增值不连续的原因

    5.1 唯一键冲突

    5.2 事务回滚

    5.3 批量写库操作

    六 参考文档 


    一 前言

           提出这个问题,是因为在工作中发现 mysql 中的 user 表的 id 默认是自增的,但是数据库存储的结果却不是连续的。

           user 表结构:

    CREATE TABLE `user` ( 
    	`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '递增id', 
    	`name` varchar(20),
    	`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', 
    	`update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', 
    	PRIMARY KEY (`id`),UNIQUE KEY `idx_name` (`name`)) 
    ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='user表'

           user 表存储:

    二 自增值存储说明

    1.1  MyISAM 引擎的自增值保存在数据文件中。

    1.2  InnoDB 引擎的自增值,其实是保存在了内存里,并且到了 MySQL 8.0 版本后,才有了“自增值持久化”的能力,也就是才实现了“如果发生重启,表的自增值可以恢复为 MySQL 重启前的值”,具体情况是:

    • 在 MySQL 5.7 及之前的版本,自增值保存在内存里。每次重启后,第一次打开表的时候,都会去找自增值的最大值 max(id),然后将 max(id) + 1 作为这个表当前的自增值。
    • 在 MySQL 8.0 版本,将自增值的变更记录在了 redo log 中,重启的时候依靠 redo log 恢复重启之前的值。

    三 自增值修改机制

         在 MySQL 里面,如果字段 id 被定义为 AUTO_INCREMENT,在插入一行数据的时候,自增值的行为如下:

    • 如果插入数据时 id 字段指定为 0、null 或未指定值,那么就把这个表当前的 AUTO_INCREMENT 值填到自增字段;
    • 如果插入数据时 id 字段指定了具体的值,就直接使用语句里指定的值。

         根据要插入的值和当前自增值的大小关系,自增值的变更结果也会有所不同。假设,某次要插入的值是 X,当前的自增值是 Y。

    • 如果 X<Y,那么这个表的自增值不变;
    • 如果 X≥Y,就需要把当前自增值修改为新的自增值。

         新的自增值生成算法是:从 auto_increment_offset 开始,以 auto_increment_increment 为步长,持续叠加,直到找到第一个大于 X 的值,作为新的自增值。其中,auto_increment_offset 和 auto_increment_increment 是两个系统参数,分别用来表示自增的初始值和步长,默认值都是 1。

    四 自增值修改时机

    insert into user values(null, '张三'); 
    

      1 当执行上述 SQL 时,执行器调用 InnoDB 引擎接口写入一行,传入的这一行的值是 (0,"张三");

      2 InnoDB 发现 SQL 没有指定自增 id 的值,获取 user 表当前的自增值 2;

      3 将传入的行的值改成 (2,"张三");

      4 将表的自增值改成 3;

      5 继续执行插入数据操作。

    五 导致自增值不连续的原因

    5.1 唯一键冲突

           假设执行 SQL 的时候 user 表 id = 10,此时在内存中的自增 id 为11,此时发生唯一键冲突写库失败,则 user 表没有 id = 10 这条记录,之后 id 从11开始写入,因此 id 是不连续的。

    5.2 事务回滚

           假设同时需要对 user、staff 表进行写库操作,执行 SQL 的时候 user 表 id = 10,此时在内存中的自增 id 为11;staff 表 id = 20,此时内存中的自增 id 为21,一旦事务执行失败,事务回滚,写库失败,则 user 表没有 id = 10 这条记录,staff 表没有 id = 20 这条记录,user 表从11开始写入,staff 表从21开始写入,如此产生 id 不连续的现象。

    5.3 批量写库操作

           对于批量插入数据的语句,MySQL 有一个批量申请自增 id 的策略:

           1. 语句执行过程中,第一次申请自增 id,会分配 1 个;

           2. 1 个用完以后,这个语句第二次申请自增 id,会分配 2 个;

           3. 2 个用完以后,还是这个语句,第三次申请自增 id,会分配 4 个;

           依此类推,同一个语句去申请自增 id,每次申请到的自增 id 个数都是上一次的两倍。

           假设批量往 user 表中写入四条记录,则这四条记录将分为三次申请id,

           第一次分配到 id = 1,第二次分配到 id = 2、3 ,第三次分配到 id = 4、5、6、7,当批量写入四条记录之后,id = 1、2、3、4将会入库,但是 id = 5、6、7就被废弃了,下一个 id 从8开始。

    六 参考文档 

    https://time.geekbang.org/column/intro/139      

    展开全文
  • 原因:1.insert 失败后,id自动增加,会造成 id 不连续 2.delete 后,再重新插入数据后,id 会从删除前最后的 id 开始增加,造成 id 不是从1开始增加注意:删除全部数据时, 不要用 delete from table;...
    原因:1.insert 失败后,id 已自动增加,会造成 id 不连续
    2.delete 后,再重新插入数据后,id 会从删除前最后的 id 开始增加,造成 id 不是从1开始增加

    注意:删除全部数据时, 不要用 delete from table;因为这样就会造成上述第二种情况,直接删除表重建就可避免。

    解决方法:
    先创建一个与原表结构相同的表,再把原表的数据复制过去,注意不要复制 id ,否则还是和原来一样
    约定: 原表:table
    新表:table1
    两个表数据结构相同

    insert into table1( 字段1,字段2...... ) select 字段1,字段2...... from table;

    语句中的字段为除 id 外的所有字段,复制过去后 id 就是从 1 开始增长且连续了
    展开全文
  • MySQL自增id不连续问题

    2021-07-12 22:13:58
    然后将文件中的数据导入到MySQL中的空表中,文件中包含自增id列 导入完成后查看数据量 这里看到数据导入成功,和预计的一样,但是 奇葩的来了,老任本来觉得应该最大的自增id应该等于数据条数,毕竟id是自增的 ...
  • 设置了mysql主键自动增长,但因为删除字段的操作导致主键不连续 解决方法 step1:在mapper.xml文件中添加update标签设置自动增长的增量为1 alter table student AUTO_INCREMENT=1; <!--StudentMapper.xml文件--&...
  • 前言:在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究竟有什么坏处?...
  • 假设在一MySQL数据表中,自增的字段为id,唯一字段为abc,还有其它字段若干。自增:AUTO_INCREMENTA、使用insert into插入数据时,若abc的值已存在,因其为唯一键,故不会插入成功。但此时,那个AUTO_INCREMENT已然+...
  • mysql怎么修改自动增长ID的步长

    千次阅读 2020-12-19 14:59:49
    怎么让mysql从1000开始自动增长1.创建表的时候就设置:CREATE TABLE `Test` (`ID` int(11) NOT NULL AUTO_INCREMENT,`NAME` varchar(50) NOT NULL, `SEX` varchar(2) NOT NULL,PRIMARY KEY (`ID`) )...
  • 很多低级开发工程师都想当然觉得自增主键是严格连续递增的,但事实真的如此吗? 创建一个测试表,执行 show create table SHOW CREATE TABLE tbl_name:显示创建指定命名表的 CREATE TABLE 语句。要使用...
  • 造成自增字段不连续的原因 1)唯一键冲突导致自增字段值不连续 示例1:创建数据表tb_student3,插入导致唯一键冲突的记录后,在插入数据 mysql> CREATE TABLE tb_student3( -> id INT PRIMARY KEY AUTO_...
  • 今天查看数据库时,发现id设置了auto_increment,但是,数据库中id不连续。正好趁着这个机会总结一下mysql常用的插入语句(insert into、insert ignore into、insert into … on duplicate key update)
  • alter table [表名] auto_increment=[起始数据]; eg: alter table aaa auto_increment = 10;
  • MySQL数据库删除数据后自增ID不连续的问题

    千次阅读 多人点赞 2021-03-10 16:38:29
    MySQL数据库删除数据后自增ID不连续引发的两种情况的解决方法
  • MySQL中实现ID编号自动增加的方法

    千次阅读 2021-01-27 00:47:51
    自增我们经常利用 mysql工具进行创建数据库这样就可以很方便的实现id字段自增了,下面我们来告诉你具体如何让字段自增的方法。在应用中我们经常要用到唯一编号。在MySQL中可通过字段的AUTO_INCREMENT属性来自动生成...
  • mysql数据库自增id,删除数据后id不连续,出现断层 当删除前几条数据,数据库重启与重启,自增的id会延续最大的id然后继续走下去,会出现断层; 当删除中间几条数据,数据库重启与重启,自增的id会延续最大的id...
  • 作为一个强迫症患者,对于表格内某些行删除之后,id不连续这个问题完全无法容忍,一开始使用 TRUNCATE TABLE tablename 来实现id从头自增,但是这个命令同时也会清空整个表,真的是坑爹啊。 后面才发现了正确的做法...
  • mysql数据库中,当数据...这样就导致主键的值看起来是不连续的.因此,我们需要通过设置,修改自增id的开始值,从而让自增id按照我们设想的值开始增加.实现这个功能,可以使用下面的sql语句:alter table 表名 auto_incre...
  • 事务回滚也会出现自增id不连续 2.4.自增id不连续可以回退?为什么MySQL这么自增方式这么设计(举例说明这么设计的原因)?解决第二个问题的思路是什么? 可以 从性能考虑。举例:假设有两个并行执行的事务,...
  • 我们在设计表结构的时候,都会给表设计主键id并且主键id设计成自增的模式,那么它的自增是否是连续的呢?下面做几个实验,来验证drop table if exists book;/*====================================================...
  • 将字典数据导入数据库以及解决insert自动增长id不是从1开始或不连续
  • 今天建了一张表,设置其"id"属性为自动增加类型,但是在查看所有数据的时候,却发现"id"的值不是连续增加的。建表的语法如下:mysql> create table person_list -> ( -> id int auto_increment unique, -> name ...
  • MySQL重大Bug!自增主键竟然不是连续递增

    千次阅读 多人点赞 2021-06-11 09:49:02
    自增主键可以让主键索引尽量保持递增顺序插入,避免了页分裂,因此索引更紧凑。 有的业务设计依赖于自增主键的连续性,即该设计假设自增主键是连续的。但这样的假设是错的,自增...更改表的存储引擎时,适用于新存
  • MySQL 中,当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值。每增加一条记录,主键会自动以相同的步长进行增长。通过给字段添加AUTO_INCREMENT属性来实现主键自...
  • 因为id不会影响业务,我也就没去管它,直到几个月后,业务跟我说,id已经增长到了2000w。。。 我查询了一下整个库的数据量,总共才40w条数据,id怎么会增长那么多? 然后我统计了一下各个id段数据的分布情况,结果...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,140
精华内容 4,856
关键字:

mysql自动增长id不连续

mysql 订阅