CREATE TABLE `test` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`username` VARCHAR(15) NOT NULL
) AUTO_INCREMENT = 100;
AUTO_INCREMENT 僅適用於整數類型,且必須具備 NOT NULL 與唯一索引(通常為 PRIMARY KEY)。建議加 UNSIGNED 將正數範圍翻倍。
| 特性 | ISAM | MyISAM | HEAP (MEMORY) | BDB | InnoDB |
|---|---|---|---|---|---|
| 刪除最大值後是否重用 | 是 | 否 | 否 | 是 | 否 |
建表指定初始值 AUTO_INCREMENT=n | 否 | 是 | 是 (4.1+) | 否 | 否 (8.0+ 支援) |
ALTER TABLE ... AUTO_INCREMENT=n 重設 | 否 | 是 | 是 | 否 | 否 (8.0+ 支援) |
| 複合索引支援多序列 | 否 | 是 | 否 | 是 | 否 |
| 預設起始值 | 1 | 1 | 1 | 1 | 1 |
CREATE TABLE `orders` (
`shop_id` INT NOT NULL,
`order_seq` INT NOT NULL AUTO_INCREMENT,
`amount` DECIMAL(10,2),
PRIMARY KEY (`shop_id`, `order_seq`) -- shop_id 為前綴,order_seq 為自增尾部
) ENGINE=MyISAM;
每個 shop_id 獨立擁有 1,2,3... 序列,互不干擾。
-- 專用序列表(永不刪除記錄)
CREATE TABLE `seq_gen` (`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB;
-- 取號並寫入主表
INSERT INTO `seq_gen` VALUES (NULL);
INSERT INTO `main_table` (`main_id`, `data`) VALUES (LAST_INSERT_ID(), 'xxx');
優點:不需鎖表/事務,高併發下無阻塞,序列永不重用。
CREATE TABLE `counter` (`name` VARCHAR(20) PRIMARY KEY, `val` INT UNSIGNED NOT NULL);
INSERT INTO `counter` VALUES ('order_no', 0);
-- 步長 10 取號
UPDATE `counter` SET `val` = LAST_INSERT_ID(`val` + 10) WHERE `name` = 'order_no';
SELECT LAST_INSERT_ID(); -- 返回新值
適用於計數器、分庫分表全域唯一 ID 生成。
auto_increment_offset + auto_increment_increment 避免雙主衝突SET @id := 0; UPDATE t SET id = @id := @id + 1; 重新排序連續號精通 AUTO_INCREMENT 在各引擎的細微差異,能避免主鍵衝突、序列重用、複寫衝突等生產事故。