萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 設定 AUTO_INCREMENT 起始值:ALTER TABLE 與 TRUNCATE 對比

方法一:ALTER TABLE AUTO_INCREMENT = N(保留資料、靈活)


-- 歸零(下一筆 ID=1)
ALTER TABLE t AUTO_INCREMENT = 1;

-- 指定起始值(分庫分表避免 ID 衝突)
ALTER TABLE t AUTO_INCREMENT = 1000000;
  • 即時生效,無需重啟,不鎖表(MDL 鎖極短)。
  • 若 N ≤ 現有最大 ID,MySQL 自動調整為 MAX(id)+1,不報錯。
  • 8.0 持久化至 Redo Log,重啟不失效。

方法二:TRUNCATE TABLE(清空表 + 歸零,極快)


TRUNCATE TABLE t;
  • DDL 操作,不可回滾,不觸發 Trigger,不寫 Binlog(Statement 格式)。
  • 釋放磁碟空間、重置自增計數器、重建索引。
  • 被外鍵引用時無法執行。

方法三:DELETE + ALTER(舊版變通,不推薦)


DELETE FROM t;
ALTER TABLE t AUTO_INCREMENT = 1;
  • DELETE 不重置自增值,產生大量 Binlog/Undo,不釋放空間,效能差。

場景選型表

場景推薦方法
測試環境清表重測TRUNCATE
生產歸檔歷史資料,新表從 1 開始CREATE TABLE new LIKE old; ALTER TABLE new AUTO_INCREMENT=1;
分庫分表合併,預留 ID 範圍ALTER TABLE t AUTO_INCREMENT = shard_id * 1000000 + 1;
刪除大量尾部資料後回收 IDALTER TABLE t AUTO_INCREMENT = (SELECT MAX(id)+1 FROM t);

InnoDB 自增鎖模式影響

  • innodb_autoinc_lock_mode = 1(預設,連續模式):簡單 INSERT 鎖表級自增鎖,批次 INSERT 可能產生間隙。
  • innodb_autoinc_lock_mode = 2(交錯模式):高併發下無鎖,但自增值不連續,LAST_INSERT_ID() 返回第一筆值,Statement 複制不安全。
  • 建議保持預設 1,或在明確需求下改 2 配合 Row 格式複制。
copyright © 萬盛學電腦網 all rights reserved