处理新老数据id冲突问题

在对项目模块进行重构并使用JPA时,遇到ID冲突问题,因为新的ID从1开始而原数据库已有数据。解决方案是创建序列,从现有最大ID+1开始生成新ID,并在JPA中配置SequenceGenerator以关联序列和实体的主键生成策略。
摘要由CSDN通过智能技术生成

项目场景:

重构项目部分模块,实现数据的处理,往原数据库里增加需要的数据。
PostgreSQL +JPA。


问题描述

本地数据库测试通过,可以正常新增数据,但是正式数据库添加失败,id冲突。


原因分析:

原本数据库中有部分数据,重构项目用JPA实现,id生成方式为auto,id从1开始新增,与原有数据库中的id冲突,无法新增。


解决方案:

一、思路:让id从目前id的最大值开始新增。
二、步骤:

  1. 找到目前数据表中的id最大值;
  2. 让id从最大值+1开始新增。

三、具体

  1. 找到目前最大值
select max(id) from table_name;
  1. 新增序列
    使用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;  
  1. 更改JPA的主键生成方式
    将auto更改为SEQUENCE
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;

更改为

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private int id;
  1. 使用
    只改生成方式肯定不行,新增的序列和表格没有建立联系,所以要建立联系。
@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的值需要与序列的初始值相同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值