萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL AUTO_INCREMENT 自增主鍵深度解析:各存儲引擎差異與進階技巧

通用特性

  • 僅支援整數型別 (TINYINT/SMALLINT/MEDIUMINT/INT/BIGINT)。
  • 必須為 NOT NULL 且擁有唯一索引 (通常為 PRIMARY KEY)。
  • 建議加 UNSIGNED 將正數範圍翻倍。
  • 達到型別上限後自增失效 (如 TINYINT UNSIGNED 上限 255)。

各引擎差異對照表

特性MyISAMInnoDBMEMORY (HEAP)BDB
指定初始值 AUTO_INCREMENT=n✅ CREATE/ALTER❌ (8.0+ 支援 ALTER)✅ CREATE/ALTER❌
最大值刪除後是否重用✅ 重用❌ 不重用❌ 不重用✅ 重用
複合索引實現多序列✅ 支援❌ 不支援❌ 不支援✅ 支援
TRUNCATE TABLE 重置✅ 歸 1✅ 歸 1✅ 歸 1✅ 歸 1

複合索引實現多獨立序列 (MyISAM/BDB)

CREATE TABLE multi_seq (
    grp_id INT NOT NULL,
    seq_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    data VARCHAR(20),
    PRIMARY KEY (grp_id, seq_id)
) ENGINE=MyISAM;

INSERT INTO multi_seq (grp_id, data) VALUES (1, 'a'), (1, 'b'), (2, 'x');
-- grp_id=1 序列: 1,2  | grp_id=2 序列: 1

進階技巧

1. 取得剛插入的自增值

INSERT INTO t (col) VALUES ('x');
SELECT LAST_INSERT_ID();  -- 會話級,不受併發影響

2. 不刪除資料也要保留自增值 (避免 TRUNCATE 重置)

DELETE FROM t WHERE 1;  -- 強制逐行刪除,保留 AUTO_INCREMENT 計數器

3. 專用序列表模式 (高併發、跨表唯一 ID)

CREATE TABLE seq_pool (id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, stub CHAR(1)) ENGINE=MyISAM;
INSERT INTO seq_pool (stub) VALUES ('a');
SELECT LAST_INSERT_ID();  -- 取得全域唯一 ID

4. 無自增實現序列 (利用 LAST_INSERT_ID(expr))

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 COLUMN id;
ALTER TABLE t ADD COLUMN id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;

MySQL 會重新產生連續編號。

copyright © 萬盛學電腦網 all rights reserved