更新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();

猜你喜欢

转载自blog.51cto.com/ycylong/2482616