MySQL之auto_increment问题记录

概述

在数据库应用中,经常用到自动递增的唯一编号来标识记录。在MySQL中,可通过数据列的auto_increment属性来自动生成。可在建表时可用“auto_increment=n”选项来指定一个自增的初始值。可用“alter table table_name auto_increment=n”命令来重设自增的起始值,当然在设置的时候MySQL会取数据表中auto_increment列的最大值 + 1与n中的较大者作为新的auto_increment值。

 

MySQL的auto_increment属性具有以下特性:

  • 具有auto_increment属性的数据列应该是一个正数序列,如果把该数据列声明为UNSIGNED,这样序列的编号个数可增加一倍。比如tinyint数据列的最大编号是127,如果加上UNSIGNED,那么最大编号变为255
  • auto_increment数据列必须有唯一索引,以避免序号重复;必须具备NOT NULL属性

    实际应用中发现,在delete掉某张innoDB表的全部数据并重启Mysql会导致该表的auto_increment列变为1。特测试多种情况下auto_increment列的变化并记录如下。

结论

1)innoDB引擎的表,在执行delete清空操作之后,表的auto_increment值不会受到影响;一旦重启Mysql数据库,那么auto_increment值将变成1

2)MyISAM引擎的表,在执行delete操作之后,表的auto_increment值不会受到影响;重启Mysql数据库,auto_increment值也不会受到影响

3)在创建innoDB表时,无论指定或不指定auto_increment,delete清空+重启数据库都会使表的auto_increment值变成1

4)delete innoDB表时,添加或不添加where 1,在数据库重启之后auto_increment都会被重置为1

5)Mysql数据库在重启之后,innoDB表的auto_increment值将会被设置为表中auto_increment列的最大值 + 1

原因

Mysql数据库的的auto_increment值是保存在内存中的,innoDB引擎的表的auto_increment在数据库服务停止时并不会做持久化操作,Mysql会在下次数据库重启的时候,相当于通过执行语句:

select max(id) maxId from table;
alter table auto_increment = maxId + 1;

来设置表table的auto_increment值。

 

严格意义上来说这是Mysql的一个bug。这个bug将会在8.0版本中得到修复。关于8.0版本的内容的情况,详见:MySQL 8.0发布,是时候与MyISAM说再见了

 

参考:MySQL--Auto_increment详解

你可能感兴趣的:(数据库)