Как автоматически сбросить порядковый номер oracle, прежде чем он достигнет максимального значения


У меня есть последовательность в моей базе данных oracle и установить максимальное число 99999. Мне нравится автоматизировать сброс до 10000, прежде чем он достигнет 99999. Ниже приведен мой сценарий myseq.

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

2 ответа:

Самый простой способ-определить последовательность как цикл:

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

Он будет снова начинаться с minvalue, когда достигнет maxvalue, то есть генерировать числа в цикле.

Oracle spec говорит:

Цикл - укажите цикл, чтобы указать, что последовательность продолжает генерировать значения после достижения максимального или минимального значения. После того как восходящая последовательность достигает своего максимального значения, она генерирует его минимальное значение. После того как нисходящая последовательность достигает своего минимума, она генерирует его максимальное значение.

Если вы находитесь в 12c, вы можете использовать столбец IDENTITY и избавиться от механизма SEQUENCE.

Если вы не находитесь на 12c, предположим, что ваш первичный ключ заполняется через последовательность с помощью триггера. Что вы можете сделать, это:

Создайте триггер с логикой для возврата последовательности в нормальное состояние., то есть после того, как каждый раз вы очищаете таблицу, последовательность будет начинаться С 1 и приращением на 1. используя изменять последовательность.

Логическая часть последовательности, использующая оператор alter (спасибо тому Кайт для это):

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;