如何在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; /