如何在达到最大数量之前自动重置oracle序列号

时间:2014-09-25 09:53:29

标签: oracle sequence

我的oracle数据库中有一个序列,并将最大数量设置为99999.我喜欢在达到99999之前自动重置为10000.下面是我的myseq脚本。

create sequence myseq
    minvalue 1
    maxvalue 99999
    increment by 1
    start with 10000;

2 个答案:

答案 0 :(得分:4)

最简单的方法是将序列定义为CYCLE:

create sequence myseq minvalue 10000 maxvalue 99999 increment by 1 CYCLE;

当达到maxvalue时,它将再次从minvalue开始,即在循环中生成数字。

Oracle规范说:

  

CYCLE - 指定CYCLE以指示序列在达到其最大值或最小值后继续生成值。   在升序序列达到其最大值后,它会生成   它的最小值。在下降序列达到最小值后,它   产生最大值。

答案 1 :(得分:2)

如果你在12c,你可以使用IDENTITY列并摆脱SEQUENCE机制。

如果您不在12c,假设您的主键是使用触发器通过序列填充的。你能做的是:

使用逻辑创建一个触发器,将序列重置为正常,    即每次清洗表格后,序列将开始    WITH 1和INCREMENT BY 1.使用ALTER SEQUENCE。

使用alter语句的序列逻辑部分(感谢Tom Kyte for    这个):

create or replace
procedure reset_sequence(p_seq in varchar2)
is
    l_value number;
begin

-- Select the next value of the sequence

    execute immediate
    'select ' || p_seq || 
    '.nextval from dual' INTO l_value;

-- Set a negative increment for the sequence, 
-- with value = the current value of the sequence

    execute immediate
    'alter sequence ' || p_seq || 
    ' increment by -' || l_value || ' minvalue 0';

-- Select once from the sequence, to 
-- take its current value back to 0

    execute immediate
    'select ' || p_seq || 
    '.nextval from dual' INTO l_value;

-- Set the increment back to 1

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

更新 :最初不知道我在想什么。根据其他答案,您需要ALTER SEQUENCETURN ON CYCLE

ALTER SEQUENCE sequence_name CYCLE;