获取最后插入的 ID
从 insert 结果读取数据库生成的自增主键 ID。
使用场景
当一次 insert 需要返回数据库生成的自增主键时,调用 .withId()。
User.kt
import com.kotlinorm.annotations.PrimaryKey
import com.kotlinorm.interfaces.KPojo
data class User(
@PrimaryKey(identity = true)
var id: Long? = null,
var name: String? = null
) : KPojo
lastInsertId适用于使用@PrimaryKey(identity = true)且主键值保持为null的插入。
读取 lastInsertId
在需要生成 ID 的那次 insert 上调用 .withId()。
kotlin
val result = User(name = "Kronos")
.insert()
.withId()
.execute()
val affectedRows = result.affectedRows
val lastInsertId = result.lastInsertIdexecute() 返回 KronosOperationResult。affectedRows 是插入行数,lastInsertId 是 wrapper 返回或内部方言 fallback 读取到的自增主键值。
不返回 ID 的情况
没有 .withId() 时,Kronos 不会请求生成 ID。
kotlin
val result = User(name = "Kronos")
.insert()
.execute()
val lastInsertId = result.lastInsertId // null如果主键值已经赋好,insert 会直接使用该值,lastInsertId 为空。
kotlin
val result = User(id = 1001, name = "Kronos")
.insert()
.withId()
.execute()
val lastInsertId = result.lastInsertId // null方言 fallback SQL
内置 KronosJdbcWrapper 会优先在 insert 执行时读取 JDBC generated keys。若 wrapper 无法直接返回 generated keys,Kronos 会使用当前方言的后续查询 SQL。
Mysql
SELECT LAST_INSERT_ID()PostgreSQL
SELECT LASTVAL()SQLite
SELECT last_insert_rowid()SQLServer
SELECT SCOPE_IDENTITY()Oracle
SELECT MAX("ID") FROM "USER"