项目场景:
重构项目部分模块,实现数据的处理,往原数据库里增加需要的数据。
PostgreSQL +JPA。
问题描述
本地数据库测试通过,可以正常新增数据,但是正式数据库添加失败,id冲突。
原因分析:
原本数据库中有部分数据,重构项目用JPA实现,id生成方式为auto,id从1开始新增,与原有数据库中的id冲突,无法新增。
解决方案:
一、思路:让id从目前id的最大值开始新增。
二、步骤:
- 找到目前数据表中的id最大值;
- 让id从最大值+1开始新增。
三、具体
- 找到目前最大值
select max(id) from table_name;
- 新增序列
使用JPA,重构建表的时候使用Auto生成方式生成,不知道原本的生成方式。
更改开始值为目前id最大值+1就行。
--说明
CREATE SEQUENCE IF NOT EXISTS "test_c_id_seq"
INCREMENT 1 // 每次递增1
MINVALUE 0 // 最小值0, 无最小值: NO MINVALUE
MAXVALUE 1000000000000000 // 最大值, 无最大值: NO MAXVALUE
START 0 // 从0开始
CACHE 1 // 设置缓存中序列的个数,建议设置
CYCLE; // 循环,表示到最大值后从头开始
--示例
CREATE SEQUENCE test_c_id_seq
START WITH 1 //从1开始
INCREMENT BY 1 //每次递增1
NO MINVALUE //无最小值
NO MAXVALUE //无最大值
CACHE 1; //设置缓存中序列的个数,建议设置
-- use
CREATE SEQUENCE IF NOT EXISTS "tag_record_seq"
INCREMENT 1
MINVALUE 0
MAXVALUE 1000000000000000
START 0
CACHE 1;
- 更改JPA的主键生成方式
将auto更改为SEQUENCE
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
更改为
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private int id;
- 使用
只改生成方式肯定不行,新增的序列和表格没有建立联系,所以要建立联系。
@Entity
@SequenceGenerator(name="teacherSEQ",sequenceName="teacherSEQ_DB", initialValue = 1,allocationSize = 1)
public class Teacher {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="teacherSEQ"
private int id;
)
}}
ps:initialValue的值需要与序列的初始值相同。