我的oracle数据库中有一个序列,并将最大数量设置为99999.我喜欢在达到99999之前自动重置为10000.下面是我的myseq
脚本。
create sequence myseq
minvalue 1
maxvalue 99999
increment by 1
start with 10000;
答案 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 SEQUENCE
到TURN ON CYCLE
。
ALTER SEQUENCE sequence_name CYCLE;