【问题标题】:How do I fix auto increment in oracle after a data refresh数据刷新后如何修复oracle中的自动增量
【发布时间】:2014-01-14 09:26:53
【问题描述】:

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

从 test_table 中选择 test_SEQ.nextval;

直到下一个序列大于表中的最大序列数。我有超过 200 个表要更新,为什么这样做更容易?

谢谢 艾琳

【问题讨论】:

  • 数据刷新的细节是什么?
  • 我在 SO 上看到了很多对同一问题的引用,所以也许做一些搜索。如何将数据从一个系统复制到另一个系统?

标签: sql oracle auto-increment


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    查看下面的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 中没有真正的方法来检测序列名称。 您也可以为此创建一个过程版本,但无论出于何种原因,我都倾向于使用函数。

    【讨论】:

      猜你喜欢
      • 2011-09-01
      • 2015-03-17
      • 1970-01-01
      • 1970-01-01
      • 2014-03-18
      • 2012-11-01
      • 2012-04-01
      • 2013-11-19
      相关资源
      最近更新 更多