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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 22:36:19