目前我正在將一列資料遷移到新表中,并創建了一個序列來生成我的主鍵,如下所示
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 應用程式插入到新表中,我的新表的 Java 代碼如下所示
@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 代碼不知道使用的最后一個值是什么,所以它試圖重用表中已經存在的相同鍵誰能告訴我我的假設是否正確或可能是什么問題?
uj5u.com熱心網友回復:
好吧,您可以通過選擇下一個序列值并檢查它是否已經存在于表中來驗證您的假設。
或者 - 并且可能更好 -重新創建序列。首先,找到最大主鍵列的值:
select max(new_table_pk) from my_new_table;
假設它回傳了2254。
然后將序列創建為max PK column value 1:
SQL> create sequence seq_my_generated start with 2255;
Sequence created.
SQL> select seq_my_generated.nextval from dual;
NEXTVAL
----------
2255
SQL>
因此,當您下次運行您的代碼時,將不再有任何重復。
uj5u.com熱心網友回復:
根據這篇文章,我的 db 序列中的增量大小為 1,默認情況下,spring-jpa 中的分配大小為 50,這意味著每 50 次計數它就會查詢 db 以獲取新的 id,因為我從 db 腳本遷移資料直到我的50 計數我的 spring-jpa 不會去查詢資料庫,所以我在我的序列生成器中更改了我的 allocationSize=1,這解決了我的問題
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/414339.html
標籤:
