更新Oracle數據庫的序列sequence

前提情景:
運行項目執行增加數據時,出現以下異常。
javax.persistence.PersistenceException: ERROR executing DML bindLog[] error[ORA-00001: unique constraint (CNBL.T_TEST_pk) violated ]。



    • 首先查詢表序列(T_TEST_SEQ)下一個序列ID是什麼:
      select T_TEST_SEQ.nextval nextid from dual ;
  • 再查表(T_TEST)的pk主鍵字段(一般序列是關聯主鍵ID)

    select col.COLUMN_NAME pkn from user_constraints con,user_cons_columns col 
    where con.constraint_name=col.constraint_name and con.constraint_type='P' and col.table_name= 'T_TEST' '';
  • 接着根據上步查到的pk主鍵字段(pkn),查表(T_TEST)主鍵最大ID

    select max(pkn) maxid from T_TEST;
  • 然後根據下一個序列數值與最大ID對比,決定修改序列的增量(或減量)。
    例如1:最大ID是100,下個序列是90,如果解決主鍵衝突,那麼需更新10步(由100-90)。
    例如2:最大ID是100,下個序列是110,如果想重置序列正常,那麼需更新-9步(由101-110,因100向下一步是101)。
// 例如1:
alter sequence T_TEST_SEQ increment by 10;
// 例如2:
alter sequence T_TEST_SEQ increment by -9;
// 不管是向前+10,還是向後-9,都需將自增步數還原爲1。
select T_TEST_SEQ.nextval nextid from dual;
alter sequence T_TEST_SEQ increment by 1;
select T_TEST_SEQ.nextval nextid from dual;

【注意:再執行下一次alter sequence XXX increment by XX前,需要執行select XXX.nextval from dual】



**延伸內容

// 查詢SQL
Ebean.createSqlQuery("select seq.nextval nextid from dual").findUnique();
// 執行更新SQL
Ebean.createSqlUpdate("alter sequence seq increment by 1").execute();

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章