首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL AUTO_INCREMENT 重啟後行為差異:MyISAM 保留最大 ID,InnoDB 回退到當前最大值

     編輯:MySQL 綜合教學

經典面試題

表有自增主鍵 ID,插入 17 條後刪除 15、16、17,重啟 MySQL,再插入一條,新 ID 是 18 還是 15?

答案

引擎新 ID原因
MyISAM18最大 ID 寫在 .MYI 索引檔案,重啟不丟失
InnoDB15最大 ID 只在內存,重啟後掃描表取 MAX(id)+1

實測驗證


-- 建表
CREATE TABLE test1 (id INT NOT NULL AUTO_INCREMENT, name VARCHAR(10), PRIMARY KEY (id)) ENGINE=InnoDB;

-- 插入 11 筆
INSERT INTO test1 (name) VALUES ('chen'),('chen'),...;
-- 刪除 9,10,11
DELETE FROM test1 WHERE id IN (9,10,11);
-- 查看 AUTO_INCREMENT
SHOW CREATE TABLE test1; -- AUTO_INCREMENT=12

-- 重啟 MySQL
service mysqld restart

-- 再次查看
SHOW CREATE TABLE test1; -- AUTO_INCREMENT=9 (InnoDB 回退)

獲取最後插入 ID


SELECT LAST_INSERT_ID(); -- 返回當前會話最後自增值

新連接返回 0。

生產影響與應對

  • InnoDB 重啟後自增值回退可能導致主鍵衝突(若應用依賴遞增不重複)
  • 解決:ALTER TABLE tbl AUTO_INCREMENT = 新起始值; 手動調大
  • 或遷移至 MySQL 8.0,持久化自增值至 redo log,重啟不回退

總結

MyISAM 持久化自增值,InnoDB 內存存儲(5.7 及以前)。重啟後 InnoDB 取 MAX(id)+1,導致自增值回退。生產環境重啟後檢查 AUTO_INCREMENT,必要時手動調大;長期規劃升級 MySQL 8.0 徹底解決。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved