Spring Boot Kotlin 执行deleteAll后重置H2数据库实体自增ID
问题原因
H2 数据库的自增 ID 计数器独立于表内存储的数据,Spring Data JPA 内置的 deleteAll() 方法底层执行的是普通 DELETE FROM 语句,只会清空表中数据,不会修改自增计数器的当前值,因此新增数据时 ID 会继续从上次删除前的最大值递增。
解决方案
方案一:使用 TRUNCATE 语句清空表(推荐学习场景使用)
TRUNCATE 操作不仅会清空表内所有数据,还会自动重置自增 ID 计数器,执行效率也远高于批量 DELETE 操作。
- 在
BookRepository中新增自定义清空方法:
interface BookRepository : JpaRepository<Book, Long> { @Modifying @Query(value = "TRUNCATE TABLE BOOK", nativeQuery = true) @Transactional fun truncateBookTable() }
- 修改
BookController中的删除逻辑:
@DeleteMapping("/deleteall") fun deleteAllBooks() { repo.truncateBookTable() }
方案二:删除数据后手动重置自增计数器
如果你需要保留原有 deleteAll() 的执行逻辑,也可以在删除完成后手动执行语句重置自增计数器:
- 在
BookRepository中新增重置方法:
interface BookRepository : JpaRepository<Book, Long> { @Modifying @Query(value = "ALTER TABLE BOOK ALTER COLUMN ID RESTART WITH 1", nativeQuery = true) @Transactional fun resetIdAutoIncrement() }
- 修改
BookController中的删除逻辑:
@DeleteMapping("/deleteall") fun deleteAllBooks() { repo.deleteAll() repo.resetIdAutoIncrement() }
注意:如果你的
Book实体自定义了表名,需要将上述 SQL 语句中的BOOK替换为你实际使用的表名。
内容的提问来源于stack exchange,提问作者Altair RuS
相关产品推荐
相关产品推荐

