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



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

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

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

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

当达到最大值时,它将再次从最小值开始,即在循环中生成数字。

Oracle规范称:

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

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

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

创建一个具有逻辑的触发器,将序列重置为正常,即每次清除表格后,序列将启动以1递增1。使用ALTER SEQUENCE。

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

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;

最新更新