主键冲突问题 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 这解决了我的问题
目前我正在将一列数据迁移到新的 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 这解决了我的问题