1. 程式人生 > 資料庫 >MySQL之auto_increment問題記錄

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.0 版本釋出,亮點都在這了! 以及 MySQL 8.0釋出,是時候與MyISAM說再見了