返回當前連接最近一次 INSERT 或 UPDATE 語句中,第一條記錄自動生成的 AUTO_INCREMENT 值。
-- 插入數據
INSERT INTO test_table (col1, col2) VALUES ('val1', 'val2');
-- 獲取自增 ID
SELECT LAST_INSERT_ID();
-- 結果:195(假設該行自增 ID 為 195)
$query = "INSERT INTO `testtable` (`col1`, `col2`) VALUES ('testvalue', 'test')";
mysql_query($query);
$query = "SELECT LAST_INSERT_ID()";
$result = mysql_query($query);
$row = mysql_fetch_row($result);
echo $row[0]; // 輸出剛插入記錄的自增 ID
| 特性 | 說明 | 影響 |
|---|---|---|
| 連接隔離 | 每個連接維護獨立的 LAST_INSERT_ID | 高併發下絕不會取到其他連接的 ID,極其安全 |
| 同一連接 | 查詢與插入必須用同一連接對象 | 連接池場景需確保同一連接,否則結果不可預期 |
| 表無關 | 插入表 A 後插入表 B,返回表 B 的 ID | 跨表操作時注意順序 |
| 多行插入 | 僅返回第一行的自增值 | 批量插入 100 行,只返回第 1 行 ID |
| 事務回滾 | 回滾不影響已生成的 ID(ID 已消耗) | 自增 ID 可能出現間隙 |
| UPDATE 觸發 | 若 UPDATE 導致 AUTO_INCREMENT 列變化,也會更新 | 罕見場景 |
-- 錯誤做法(高併發下極不安全)
SELECT MAX(id) FROM table;
高併發時,連接 A 插入後未查 MAX,連接 B 插入並查 MAX,連接 A 查到的可能是 B 的 ID。
INSERT INTO t VALUES (NULL, 'Mary'), (NULL, 'Jane'), (NULL, 'Lisa');
SELECT LAST_INSERT_ID(); -- 返回第一行的 ID(如 2),而非最後一行(4)
設計目的:便於主從複製時,從庫重放相同語句產生相同 ID 序列。
SELECT LAST_INSERT_ID(100); -- 返回 100,並將連接內部計數器設為 100
SELECT LAST_INSERT_ID(); -- 後續調用返回 100
少用,特殊業務需手動設置下一自增值時使用。
| 語言/驅動 | 獲取方法 |
|---|---|
| JDBC (MySQL Connector/J) | Statement.getGeneratedKeys() 或 Connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS) |
| Python (mysqlclient/PyMySQL) | cursor.lastrowid |
| Go (go-sql-driver/mysql) | result.LastInsertId() |
| Node.js (mysql2) | result.insertId |
| PHP (mysqli) | $mysqli->insert_id |
| PHP (PDO) | $pdo->lastInsertId() |
getGeneratedKeys/lastrowid/insert_id,避免額外查詢