You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot Kotlin 执行deleteAll后重置H2数据库实体自增ID

问题原因

H2 数据库的自增 ID 计数器独立于表内存储的数据,Spring Data JPA 内置的 deleteAll() 方法底层执行的是普通 DELETE FROM 语句,只会清空表中数据,不会修改自增计数器的当前值,因此新增数据时 ID 会继续从上次删除前的最大值递增。

解决方案

方案一:使用 TRUNCATE 语句清空表(推荐学习场景使用)

TRUNCATE 操作不仅会清空表内所有数据,还会自动重置自增 ID 计数器,执行效率也远高于批量 DELETE 操作。

  1. 在 BookRepository 中新增自定义清空方法:
interface BookRepository : JpaRepository<Book, Long> {
    @Modifying
    @Query(value = "TRUNCATE TABLE BOOK", nativeQuery = true)
    @Transactional
    fun truncateBookTable()
}
  1. 修改 BookController 中的删除逻辑:
@DeleteMapping("/deleteall")
fun deleteAllBooks() {
    repo.truncateBookTable()
}

方案二:删除数据后手动重置自增计数器

如果你需要保留原有 deleteAll() 的执行逻辑,也可以在删除完成后手动执行语句重置自增计数器:

  1. 在 BookRepository 中新增重置方法:
interface BookRepository : JpaRepository<Book, Long> {
    @Modifying
    @Query(value = "ALTER TABLE BOOK ALTER COLUMN ID RESTART WITH 1", nativeQuery = true)
    @Transactional
    fun resetIdAutoIncrement()
}
  1. 修改 BookController 中的删除逻辑:
@DeleteMapping("/deleteall")
fun deleteAllBooks() {
    repo.deleteAll()
    repo.resetIdAutoIncrement()
}

注意:如果你的 Book 实体自定义了表名,需要将上述 SQL 语句中的 BOOK 替换为你实际使用的表名。

内容的提问来源于stack exchange,提问作者Altair RuS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 13:15:03