AUTO_INCREMENT 是整數列屬性,自動生成唯一遞增序列,常用於主鍵。僅適用於整數類型,且必須包含唯一索引(通常為主鍵)。
| 特性 | ISAM | MyISAM | HEAP/MEMORY | BDB | InnoDB |
|---|---|---|---|---|---|
| 刪除最大值後是否重用 | 是 | 否 | 否 | 是 | 否 |
| CREATE/ALTER TABLE 指定起始值 | 否 | 支援 AUTO_INCREMENT=n | 支援(4.1+) | 不支援 | 不支援 |
| 復合索引多序列 | 否 | 支援 | 不支援 | 支援 | 不支援 |
| 序列最大值限制 | 受列類型限制 | 同左 | 同左 | 同左 | 同左 |
建表語句:
CREATE TABLE t ( grp_id INT NOT NULL, seq INT NOT NULL AUTO_INCREMENT, data VARCHAR(20), PRIMARY KEY (grp_id, seq) ) ENGINE=MyISAM;
效果:每個 grp_id 獨立維護一個從 1 開始的 seq 序列。
TRUNCATE TABLE 或無 WHERE 的 DELETE 會重置計數器。保留序列請用 DELETE FROM t WHERE 1(逐行刪除,較慢)。CREATE TABLE seq_gen (id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY) ENGINE=MyISAM; -- 獲取新 ID INSERT INTO seq_gen VALUES (NULL); SELECT LAST_INSERT_ID(); -- 返回新 ID -- 業務表使用 INSERT INTO main_tbl (id, ...) VALUES (LAST_INSERT_ID(), ...);
ALTER TABLE t DROP COLUMN id; ALTER TABLE t ADD COLUMN id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
CREATE TABLE counter (name VARCHAR(20) PRIMARY KEY, val BIGINT UNSIGNED NOT NULL);
INSERT INTO counter VALUES ('order_no', 0);
-- 獲取下一值(步長可調)
UPDATE counter SET val = LAST_INSERT_ID(val + 10) WHERE name = 'order_no';
SELECT LAST_INSERT_ID(); -- 返回 10, 20, 30...
優點:無需表鎖/事務,高併發下性能極佳,可維護多個獨立計數器。
INSERT 僅返回第一行生成的 ID。LAST_INSERT_ID(expr) 可手動設置下一次返回值。