如何在Oracle中重置序列?

时间:2020-03-05 18:49:55  来源:igfitidea点击:

在PostgreSQL中,我可以做这样的事情:

ALTER SEQUENCE serial RESTART WITH 0;

是否有Oracle等效产品?

解决方案

回答

不能真正重启AFAIK。 (如果我错了,请纠正我!)。

但是,如果要将其设置为0,则可以删除并重新创建它。

如果要将其设置为特定值,可以将INCREMENT设置为负值并获取下一个值。

也就是说,如果序列为500,则可以通过以下方式将其设置为100

ALTER SEQUENCE serial INCREMENT BY -400;
SELECT serial.NEXTVAL FROM dual;
ALTER SEQUENCE serial INCREMENT BY 1;

回答

更改序列的INCREMENT值,将其递增,然后再将其更改回是很轻松的,此外,我们还具有不必像删除/重新创建序列那样重新建立所有授予的好处。

回答

这是一个很好的过程,可以将Oracle专家Tom Kyte的任何序列重置为0。在下面的链接中也对正反两面进行了很好的讨论。

[email protected]> 
create or replace
procedure reset_seq( p_seq_name in varchar2 )
is
    l_val number;
begin
    execute immediate
    'select ' || p_seq_name || '.nextval from dual' INTO l_val;

    execute immediate
    'alter sequence ' || p_seq_name || ' increment by -' || l_val || 
                                                          ' minvalue 0';

    execute immediate
    'select ' || p_seq_name || '.nextval from dual' INTO l_val;

    execute immediate
    'alter sequence ' || p_seq_name || ' increment by 1 minvalue 0';
end;
/

在此页面上:用于重置序列值的动态SQL
这里也有另一个很好的讨论:如何重置序列?

回答

此存储过程将重新启动我的序列:

Create or Replace Procedure Reset_Sequence  
  is
  SeqNbr Number;
begin
   /*  Reset Sequence 'seqXRef_RowID' to 0    */
   Execute Immediate 'Select seqXRef.nextval from dual ' Into SeqNbr;
   Execute Immediate 'Alter sequence  seqXRef increment by - ' || TO_CHAR(SeqNbr) ;
   Execute Immediate 'Select seqXRef.nextval from dual ' Into SeqNbr;
   Execute Immediate 'Alter sequence  seqXRef increment by 1';
END;

/

回答

1)假设我们创建了一个SEQUENCE,如下所示:

CREATE SEQUENCE TESTSEQ
INCREMENT BY 1
MINVALUE 1
MAXVALUE 500
NOCACHE
NOCYCLE
NOORDER

2)现在,我们从SEQUENCE获取值。可以这样说,我取了四次,如下所示。

SELECT TESTSEQ.NEXTVAL FROM dual
SELECT TESTSEQ.NEXTVAL FROM dual
SELECT TESTSEQ.NEXTVAL FROM dual
SELECT TESTSEQ.NEXTVAL FROM dual

3)执行完上述四个命令后,SEQUENCE的值将为4. 现在假设我已将SEQUENCE的值再次重置为1. 请遵循以下步骤。按照如下所示的顺序执行所有步骤:

  • ALTER SEQUENCE TESTSEQ INCREMENT BY -3;
  • 从双重选择SELECT TESTSEQ.NEXTVAL
  • ALTER SEQUENCE TESTSEQ INCREMENT BY 1;
  • 从双重选择SELECT TESTSEQ.NEXTVAL

回答

这是我的方法:

  • 删除序列
  • 重新创建

例子:

--Drop sequence

DROP SEQUENCE MY_SEQ;

-- Create sequence 

create sequence MY_SEQ
minvalue 1
maxvalue 999999999999999999999
start with 1
increment by 1
cache 20;

回答

以下脚本将序列设置为所需的值:

给定一个新创建的名为PCS_PROJ_KEY_SEQ的序列和表PCS_PROJ:

BEGIN
   DECLARE
      PROJ_KEY_MAX       NUMBER := 0;
      PROJ_KEY_CURRVAL   NUMBER := 0;
   BEGIN

    SELECT MAX (PROJ_KEY) INTO PROJ_KEY_MAX FROM PCS_PROJ;
    EXECUTE IMMEDIATE 'ALTER SEQUENCE PCS_PROJ_KEY_SEQ INCREMENT BY ' || PROJ_KEY_MAX;
    SELECT PCS_PROJ_KEY_SEQ.NEXTVAL INTO PROJ_KEY_CURRVAL FROM DUAL;
    EXECUTE IMMEDIATE 'ALTER SEQUENCE PCS_PROJ_KEY_SEQ INCREMENT BY 1';

END;
END;
/