LAST_INSERT_ID() 返回最近一條 INSERT 語句中,AUTO_INCREMENT 列自動生成的第一個值。
關鍵限制:
CREATE TABLE t_id (id INT AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB; -- 1. 單行隱式插入 INSERT INTO t_id VALUES (); SELECT LAST_INSERT_ID(); -- 1 ✅ -- 2. 單行隱式插入 INSERT INTO t_id VALUES (); SELECT LAST_INSERT_ID(); -- 2 ✅ -- 3. 多行隱式插入(3 行) INSERT INTO t_id VALUES (), (), (); SELECT LAST_INSERT_ID(); -- 3 ❌ 預期 5,實際返回第一行生成值 3 -- 4. 再次多行插入 INSERT INTO t_id VALUES (), (), (); SELECT LAST_INSERT_ID(); -- 6 ✅ 第一行生成值 6 -- 5. 顯式指定值 INSERT INTO t_id VALUES (10); SELECT LAST_INSERT_ID(); -- 6 ❌ 仍返回 6,因為未觸發自動生成
With no argument, LAST_INSERT_ID() returns a 64-bit value representing the first automatically generated value successfully inserted for an AUTO_INCREMENT column as a result of the most recently executed INSERT statement.
If you insert multiple rows using a single INSERT statement, LAST_INSERT_ID() returns the value generated for the first inserted row only.
| 誤區 | 真相 | 正確做法 |
|---|---|---|
| 以為返回最後一行 ID | 返回第一行自動生成 ID | 單行插入或應用層計算 |
| 顯式指定 ID 後以為會更新 | 不更新,仍保持上次自動生成值 | 避免業務依賴此場景 |
| 以為是全局/跨會話共享 | 會話級隔離,線程安全 | 放心在高併發使用 |
| 以為 UPDATE 會觸發 | 僅 INSERT 觸發 | 更新不影響 |
-- 手動設置會話級 LAST_INSERT_ID INSERT INTO t_id VALUES (NULL); SET @my_id = LAST_INSERT_ID(); -- 後續語句可引用 INSERT INTO t_child (parent_id, data) VALUES (@my_id, 'child data'); -- 或 SELECT LAST_INSERT_ID(@my_id); -- 設置並返回 @my_id
SELECT AUTO_INCREMENT FROM information_schema.TABLES)LAST_INSERT_ID() 設計初衷是單條 INSERT 後獲取自增 ID,完美支持「主表插入 → 獲取 ID → 子表插入」模式。多行插入、顯式指定值等場景超出設計範圍,切勿強行依賴。記住口訣:最近一條 INSERT,第一個自動生成值。