Spring Dashboard项目自增ID与data.sql初始化数据冲突问题求助
解决IDENTITY自增ID起始值被初始化数据占用的问题
问题背景
通过src/main/resources/data.sql插入了id为1、2、3的article初始数据:
INSERT INTO article(id, title, content) VALUES (1, 'Hello World !', 'Hello World' ); INSERT INTO article(id, title, content) VALUES (2, 'Hello World !', 'Hello World'); INSERT INTO article(id, title, content) VALUES (3, 'Hello World !', 'Hello World');
实体类ID使用GenerationType.IDENTITY自增策略:
@Column @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Long id;
Spring Boot配置已开启延迟数据源初始化:
spring.jpa.defer-datasource-initialization= true spring.sql.init.mode=always spring.datasource.initialization-mode=always spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true
预期新增数据时ID从4开始自增,但实际从1开始,引发主键冲突。
核心原因
IDENTITY策略依赖数据库自身的自增计数器(如MySQL的AUTO_INCREMENT、PostgreSQL的序列),直接通过INSERT语句指定ID插入数据时,不会自动更新数据库的自增计数器,因此数据库仍认为下一个可用ID是1。
解决方案
1. 手动重置数据库自增计数器
在data.sql末尾添加对应数据库的重置语句,确保插入初始数据后更新自增起始值:
MySQL/MariaDB
ALTER TABLE article AUTO_INCREMENT = 4;
PostgreSQL
-- 将序列article_id_seq的当前值设为3,下一个值自动从4开始 SELECT setval('article_id_seq', 3, true);
SQL Server
DBCC CHECKIDENT ('article', RESEED, 3);
2. 确认初始化脚本执行顺序
当前配置中spring.jpa.defer-datasource-initialization=true已经确保data.sql在Hibernate创建/更新表结构之后执行,无需额外调整。如果是旧版本Spring Boot(<2.5),需确保初始化脚本在Hibernate DDL之后运行。
3. 改用SEQUENCE生成策略(可选)
如果不想依赖数据库的自增特性,可以切换到SEQUENCE生成策略,手动指定序列起始值:
@Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "article_seq") @SequenceGenerator( name = "article_seq", sequenceName = "article_id_seq", initialValue = 4, allocationSize = 1 ) private Long id;
该方式适用于支持序列的数据库(PostgreSQL、Oracle、MySQL 8.0+等)。
内容的提问来源于stack exchange,提问作者Samuel Yoo
相关产品推荐
相关产品推荐

