CREATE TABLE test ( id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, username VARCHAR(15) NOT NULL ) AUTO_INCREMENT = 100;
| 特性 | ISAM | MyISAM | HEAP/MEMORY | BDB | InnoDB |
|---|---|---|---|---|---|
| 起始值 | 1 | 可指定 (AUTO_INCREMENT=n) | 可指定 (5.0.3+) | 不可指定 | 不可指定 (5.6+ 支持) |
| 修改起始值 | 不支持 | ALTER TABLE t AUTO_INCREMENT=n | ALTER TABLE t AUTO_INCREMENT=n | 不支持 | 5.6+ 支持 ALTER TABLE |
| 最大值刪除後重用 | 是 | 否 | 否 | 是 | 否 |
| 復合索引多序列 | 不支持 | 支持 (PK 前綴 + AI 列) | 不支持 | 支持 | 不支持 |
| UPDATE 修改 AI 列 | 衝突報錯/改變下一值 | 同左 | 同左 | 同左 | 同左 |
| REPLACE 影響 | WHERE 用 AI 列則不變,否則重新生成 | 同左 | 同左 | 同左 | 同左 |
| LAST_INSERT_ID() | 支持 | 支持 | 支持 | 支持 | 支持 |
| TRUNCATE 重置 | 歸 1 | 歸 1 | 歸 1 | 歸 1 | 歸 1 |
UNSIGNED 擴大範圍ALTER TABLE t AUTO_INCREMENT=n(n ≥ 當前最大值+1)DELETE FROM t; -- 觸發優化:實際 DROP+重建表 TRUNCATE TABLE t; -- 同效果
保留序列:DELETE FROM t WHERE 1; 強制逐行判斷,不觸發優化。
CREATE TABLE seq (id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT); INSERT INTO seq VALUES (NULL); -- 生成新 ID INSERT INTO main SET main_id = LAST_INSERT_ID(); -- 業務表使用
ALTER TABLE tablename AUTO_INCREMENT = num;
num 必須 ≥ 當前最大值+1,否則語法成功但無效果。
CREATE TABLE seq_table (id INT UNSIGNED NOT NULL); INSERT INTO seq_table VALUES (0); -- 獲取下一序列(步長 1) UPDATE seq_table SET id = LAST_INSERT_ID(id + 1); SELECT LAST_INSERT_ID(); -- 步長 10 UPDATE seq_table SET id = LAST_INSERT_ID(id + 10); SELECT LAST_INSERT_ID();
優點:無需鎖表/事務,高並發下生成唯一序列,可構建多計數器(多行記錄不同計數)。
最簡單:ALTER TABLE t DROP id; ALTER TABLE t ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST; MySQL 自動生成連續編號。