主鍵自增(AUTO_INCREMENT)是 MySQL 表設計中最常用的特性之一,能自動為新記錄分配唯一整數識別碼。本文系統梳理自增主鍵的建表語法、起始值控制、常見陷阱與最佳實踐,助你避開坑點、用好這項功能。
CREATE TABLE `emb_t_dictBusType` (
`emb_c_busTypeID` INT NOT NULL AUTO_INCREMENT,
`emb_c_busTypeEnName` VARCHAR(255) NOT NULL,
`emb_c_busTypeZhName` VARCHAR(255) NOT NULL,
PRIMARY KEY (`emb_c_busTypeID`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
AUTO_INCREMENT 僅能用於整數型別(TINYINT/SMALLINT/MEDIUMINT/INT/BIGINT),且通常搭配 NOT NULL 與 PRIMARY KEY 或 UNIQUE KEY。CREATE TABLE `emb_t_dictBusType` (
`emb_c_busTypeID` INT NOT NULL AUTO_INCREMENT,
`emb_c_busTypeEnName` VARCHAR(255) NOT NULL,
`emb_c_busTypeZhName` VARCHAR(255) NOT NULL,
PRIMARY KEY (`emb_c_busTypeID`)
) ENGINE=InnoDB AUTO_INCREMENT=1001 DEFAULT CHARSET=gbk;
在表選項中加入 AUTO_INCREMENT=1001,首筆記錄的 ID 將從 1001 開始。適用場景:
-- 查看當前自增值
SHOW TABLE STATUS LIKE 'emb_t_dictBusType'\G
-- 修改下一條記錄的自增值(必須大於現有最大值)
ALTER TABLE `emb_t_dictBusType` AUTO_INCREMENT = 2001;
注意:ALTER TABLE ... AUTO_INCREMENT=N 中的 N 必須大於表中現有的最大主鍵值,否則無效。
INT UNSIGNED 最大值約 42.9 億,BIGINT UNSIGNED 約 1.8×1019。高併發、長週期系統建議直接用 BIGINT,成本極低且一勞永逸。
InnoDB 的自增計數器在事務啟動時預分配,回滾不歸還,屬正常行為。業務若需連續無縫 ID,應在應用層生成(如號段模式),而非依賴自增。
雙主或多主架構需配置:
[mysqld]
auto_increment_increment = 2 -- 步長
auto_increment_offset = 1 -- 起始偏移(另一節點設 2)
確保各節點生成的 ID 互不重疊。
TRUNCATE TABLE 會重置自增計數器TRUNCATE 會將自增值重置為初始值(或 1),DELETE 則保留。若需保留自增進度,請用 DELETE 配合 LIMIT 分批清理。
BIGINT:預防溢位,無額外存儲壓力(InnoDB 主鍵聚簇索引本身即按主鍵排序)。VARCHAR 或 BIGINT 算法生成),自增 ID 僅供內部關聯查詢使用。AUTO_INCREMENT。SHOW TABLE STATUS 的 Auto_increment 值,配合告警預留擴容時間。MySQL 自增主鍵看似簡單,實則涉及存儲引擎行為、複制一致性、業務邏輯耦合等多層面考量。掌握其語法細節與底層特性,合理規劃 ID 空間,能為系統穩定演進打下堅實基礎。