在採用 AUTO_INCREMENT 主鍵的主從表設計中,常見流程是:先寫入主表,取得自動生成的 ID,再以此 ID 寫入從表。關鍵難點在於併發環境下如何精準獲取「當前連線」剛插入的 ID。
早期常用 SELECT MAX(id) FROM table,但此法在高併發下極不靠譜:
MySQL 提供 LAST_INSERT_ID() 函數,其返回值嚴格綁定當前資料庫連線(Session),互不干擾,無需加鎖,效能極佳。
SELECT LAST_INSERT_ID(),結果各自返回自己插入的 ID,互不影響。SELECT MAX(id),兩連線則會得到相同的最大值,無法區分。此機制類似 SQL Server 的 SCOPE_IDENTITY()(當前作用域/連線),而非 IDENT_CURRENT()(全表最大值)。
INSERT INTO tb (c1, c2) VALUES (v1, v2), (v3, v4), (v5, v6);
SELECT LAST_INSERT_ID(); -- 僅返回第一筆 (v1,v2) 的 ID
若批次寫入後需獲取所有 ID,建議:
INSERT,逐筆獲取。INSERT ... RETURNING(MySQL 8.0.27+ 支援)。LAST_INSERT_ID() 獲取剛插入的自增 ID,拒絕 MAX(id)。RETURNING 子句。