比如主键是 1,3,5,7,9,11 中间跳号了
用什么方法可以把主键重新排列为 1,2,3,4,5

解决方案 »

  1.   

    update tablename set id=rownum通过下面的方法重置你得序列修改那个start with值SQL> create sequence seq_1 increment by 1 start with 1 maxvalue 999999999;
                    序列已创建。
            SQL> create or replace procedure seq_reset(v_seqname varchar2) as
             2  n number(10);
             3  tsql varchar2(100);
             4  begin
             5  execute immediate 'select '||v_seqname||'.nextval from dual' into n;
             6  n:=-(n-1);
             7  tsql:='alter sequence '||v_seqname||' increment by '|| n;--让序列一次递增-N,实现归0
             8  execute immediate tsql;
             9  execute immediate 'select '||v_seqname||'.nextval from dual' into n;
            10  tsql:='alter sequence '||v_seqname||' increment by 1';
            11  execute immediate tsql;
            12  end seq_reset;
            13  /
            过程已创建。
            SQL> select seq_1.nextval from dual;
             NEXTVAL
            ---------
                   2
            SQL> /
             NEXTVAL
            ---------
                    3
            SQL> /
            NEXTVAL
            ---------
                    4
            SQL> /
            NEXTVAL
            ---------
                    5
            SQL> exec seq_reset('seq_1');
            PL/SQL 过程已成功完成。
            SQL> select seq_1.currval from dual;
            CURRVAL
            ---------
                    1
            SQL> 
      

  2.   

    第一种方法:
    这种方法可以实现你的要求,但要分两步做:(1)创建一个序列:
       create sequence minus_value
       start with 1
       minvalue 1
       increment by 1;
    (2)更新数据库列
       update yourtable set colnum=minus_value.nextval;
    如果是一个刚刚新创建的序列,则执行上面的更新语句后,可以保证主键顺序是从1开始的.如果你所用的序列是一个已经被用过的,则还要执行一个更新语句,
      update yourtable set colnum=colnum - <value>;
    这个value就是序列的起始值与1的差值.第二种方法:
    可以用ROWNUM与主键值之间的差值实现