我的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 SEQUENCE
到TURN ON CYCLE
。
ALTER SEQUENCE sequence_name CYCLE;