oracle 数据导出导入序列不一致问题

时间:2022-02-21 13:29:21

1.ORACLE数据库在导入导出时序列不一致的问题

 

在使用ORACLE数据库时,当给一个表设置自增字段时,我们经常会使用到序列+触发器来完成。但当你需要对数据库进行导入导出时,序列很容易出问题。

当你将数据库导出后,导入到另一个数据时,你会发现另一个数据库里的序列当前值会小于之前数据库的当前值,由此会导致你往该表插入数据时,会出现自增字

段的值重复的情况,如果这个自增字段为主键,则你的插入操作就会报错。

在网上找了一下资料,发现原来我们对数据库执行导出操作时,数据库先进行的是序列的导出,然后再进行表数据的导出,如果在序列导出的过程中,该系统一直在使用,则序列导出

完成后,开始导表数据的时候,有可能表数据因为系统在不断的使用导致表数据增长,里面的序列当前值已经增加了很多。当数据库导出完成后,会造成数据表中的实际记录跟序列的当前值不一致。

该问题的解决方法:在导入数据库成功后,重建序列,将序列当前值修改为表记录自增字的最大值+1,即可。如下2:

 

2. Oracle重置序列(不删除重建方式)

Oracle中一般将自增sequence重置为初始1时,都是删除再重建,这种方式有很多弊端,依赖它的函数和存储过程将失效,需要重新编译。

不过还有种巧妙的方式,不用删除,利用步长参数,先查出sequencenextval,记住,把递增改为负的这个值(反过来走),然后再改回来。

 假设需要修改的序列名:seq_name

1select seq_name.nextval from dual; //假设得到结果5656

2、 alter sequence seq_name increment by -5655; //注意是-(n-1)

3 select seq_name.nextval from dual;//再查一遍,走一下,重置为1

4  alter sequence seq_name increment by 1;//还原

可以写个存储过程,以下是完整的存储过程,然后调用传参即可

create or replace procedure seq_reset(v_seqname varchar2as number(10);
tsql varchar2(100);
 begin
 execute immediate 'select '||v_seqname||'.nextval from dual' into n;
  n:=-(n-1);
  tsql:='alter sequence '||v_seqname||' increment by '|| n;
  execute immediate tsql;
 execute immediate 'select '||v_seqname||'.nextval from dual' into n;
  tsql:='alter sequence '||v_seqname||' increment by 1';
 execute immediate tsql;
 end seq_reset;


 3. 查看数据列表的序列的最大值

select max(to_number(a.zj))  from cjgl_djksmdb a