如何在数据刷新后修复oracle中的自动增量

时间:2013-12-26 18:48:40

标签: sql oracle auto-increment

每次我的团队对我们的UAT环境进行数据刷新时,我们都会遇到oracle中“自动递增”列的问题它们会保留旧值,因此在发生新插入时会导致错误。我找到的唯一解决方案是使用

从test_table中选择test_SEQ.nextval;

直到下一个序列大于表格中的最大序列号。我有200多个表要更新,有更容易的原因吗?

由于 埃林

2 个答案:

答案 0 :(得分:0)

更好的方法是删除序列并使用所需的START WITH值创建新序列。您可以生成DDL以动态执行此操作。

答案 1 :(得分:0)

检查以下sqlfiddle http://sqlfiddle.com/#!4/17345/1

由于sqlfiddle的限制,它不能完全正常工作,但这是实现它的功能:

create or replace function 
reset_sequence(p_sequence_name varchar, 
               p_table_name varchar, 
               p_column_name varchar)
return integer is
v_temp integer;
v_sql varchar(2000);
begin
v_sql := 'select nvl(max('||p_column_name||'),0)+1 col_name from '||p_table_name;
execute immediate v_sql INTO v_temp;

  v_sql := 'drop sequence '||p_sequence_name;
  execute immediate v_sql;


v_sql := 'create sequence '||p_sequence_name||' start with '||v_temp;
execute immediate v_sql;

return v_temp;
end;

基本上,您调用此函数并传递模式名称,表名称和列名称,并将函数设置为正确的值。您可以放置​​一个开始/异常/结束块,以便在丢弃序列时忽略错误,以防它不存在,但所有这些只是结冰。如果需要,您还可以让它检测作为主键的列,但在Oracle中没有检测序列名称的实际方法。 你也可以制作一个程序版本,但我倾向于因为某种原因而喜欢函数。