主键冲突问题 oracle db

Primary key violation issue oracle db

目前我正在将一列数据迁移到新的 table 并且我创建了一个序列来像这样生成我的主键

CREATE SEQUENCE seq_my_generated
  MINVALUE 1
  MAXVALUE 99999999
  START WITH 1
  INCREMENT BY 1

并且我使用以下脚本迁移了数据

INSERT INTO my_new_table( new_table_pk, old_table_pk_as_fk, attachment) SELECT seq_my_generated.nextval, old_table_pk, attachment FROM old_table

到那时一切正常,现在在实际环境中,新数据将通过我的 java 应用程序插入新 table,我的 Java 代码用于我的新 table 看起来像这样

@Entity
@Table(name="my_new_table")
public class NewTable{

@Id
@GeneratedValue(strategy = SEQUENCE, generator ="seq_my_generated")
@SequenceGenerator(name="seq_my_generated")
@Column(name="new_table_pk")
long id;
//rest parameters
}

现在,当我尝试通过应用程序插入新数据时,我收到 主键唯一性违规异常, 我的假设是当我使用 db 脚本迁移数据时,我的 java 代码不知道最后使用的值是什么,因此它尝试重用 table 中已经存在的相同密钥 谁能告诉我我的假设是否正确或者可能是什么问题?

那么,您可以通过选择下一个序列值并检查它是否已经存在于 table 中来验证您的假设。


或者 - 可能更好 - 重新创建序列。首先,找到最大主键列的值:

select max(new_table_pk) from my_new_table;

假设它返回 2254

然后创建序列为最大PK列值+ 1:

SQL> create sequence seq_my_generated start with 2255;

Sequence created.

SQL> select seq_my_generated.nextval from dual;

   NEXTVAL
----------
      2255

SQL>

因此,当您下次运行您的那个代码时,将不再有任何重复。

根据 this 文章 我的 db 序列中的增量大小为 1,默认情况下分配大小在 spring-jpa 中为 50,这意味着每 50 个计数它查询 db 以获取新的 id,因为我将数据从 db 脚本迁移到我的50 count 我的 spring-jpa 不会去查询数据库,所以我在我的序列生成器中更改了我的 allocationSize=1 这解决了我的问题