資料插入後,如何精準獲取資料庫自動生成的自增主鍵 ID?這是批次處理、主從表關聯寫入等場景的剛需。
getGeneratedKeys()(推薦)String sql = "INSERT INTO users (username,password,email) VALUES (?,?,?)";
PreparedStatement pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
pstmt.setString(1, user.getUsername());
pstmt.setString(2, user.getPassword());
pstmt.setString(3, user.getEmail());
pstmt.executeUpdate();
ResultSet rs = pstmt.getGeneratedKeys();
if (rs.next()) {
int autoIncKey = rs.getInt(1); // 精準拿到剛插入的 ID
}
優點:JDBC 標準、跨資料庫、線程安全、支援批次插入獲取多個 ID。
缺點:需資料庫驅動支援(MySQL 5.0+ 完美支援)。
SELECT MAX(id)(不推薦用於併發)SELECT MAX(id) FROM table
致命缺陷:高併發下極易取到其他線程插入的 ID,導致資料錯亂,僅適合單線程或測試環境。
LAST_INSERT_ID() / @@IDENTITYSELECT LAST_INSERT_ID() -- 或 SELECT @@IDENTITY
特性:基於當前連線,天然隔離併發衝突。
注意:若單條 INSERT 插入多行,返回的是第一行的 ID,後續 ID 需自行推算。