CREATE TABLE t (
id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(15) NOT NULL
) AUTO_INCREMENT = 100; -- 指定起始值
| 特性 | ISAM | MyISAM | HEAP (MEMORY) | BDB | InnoDB |
|---|---|---|---|---|---|
| 刪除最大值後是否重用 | 是 | 否 | 否 | 是 | 否 |
| CREATE/ALTER TABLE 指定起始值 | 不支援 | 支援 | 支援 (4.1+) | 不支援 | 不支援 |
| 複合索引產生多序列 | 不支援 | 支援 | 不支援 | 支援 | 不支援 |
| 備註 | 舊引擎 | MyISAM 預設 | 純記憶體 | 事務引擎 | 主流事務引擎 |
CREATE TABLE animals (
grp ENUM('fish','mammal','bird') NOT NULL,
id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(30) NOT NULL,
PRIMARY KEY (grp, id) -- grp 為第一鍵,id 為第二鍵
) ENGINE=MyISAM;
INSERT INTO animals (grp, name) VALUES
('mammal','dog'),('mammal','cat'),
('bird','penguin'),('fish','shark'),
('bird','ostrich'),('mammal','whale');
SELECT * FROM animals ORDER BY grp, id;
-- 結果:
-- bird 1 penguin
-- bird 2 ostrich
-- fish 1 shark
-- mammal 1 dog
-- mammal 2 cat
-- mammal 3 whale
-- 每個 grp 內部 id 獨立遞增
TRUNCATE TABLE / DELETE FROM tbl (無 WHERE) 會重置計數器從 1 開始。
DELETE FROM tbl WHERE 1(逐行評估,較慢但保留序列)。seq(id INT UNSIGNED AUTO_INCREMENT),插入 NULL 取得 ID,再 LAST_INSERT_ID() 寫入主表。ALTER TABLE t DROP id, ADD id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY 可重新排列連續編號。CREATE TABLE seq (id INT UNSIGNED NOT NULL);
INSERT INTO seq VALUES (0);
-- 取得下一序列 (步長 1)
UPDATE seq SET id = LAST_INSERT_ID(id + 1);
SELECT LAST_INSERT_ID(); -- 返回 1, 2, 3...
-- 步長 10
UPDATE seq SET id = LAST_INSERT_ID(id + 10);
SELECT LAST_INSERT_ID(); -- 返回 10, 20, 30...
優點:無需鎖表/事務,並發安全,適合計數器、票號生成器。
MyISAM/InnoDB 為主流選擇,MyISAM 重用、InnoDB 不重用 是最大行為差異。複合索引多序列僅 MyISAM/BDB 支援。設計時務必評估「是否允許重用」、「最大值上限」、「並發缺口容忍度」,並配合 LAST_INSERT_ID() 正確獲取新 ID。