Последовательность Oracle, начинающаяся с 2 вместо 1 - PullRequest
11 голосов
/ 11 ноября 2010

Неожиданное поведение:

Я сталкиваюсь со странным поведением последовательностей Oracle с 11g (работает с 10g):

CREATE SEQUENCE test_sequence START WITH 1;
CREATE TABLE test_table ( val INT );

INSERT INTO test_table VALUES ( test_sequence.NEXTVAL );

Evenхотя последовательность начинается с 1 , первое введенное значение равно 2 :

SELECT * FROM test_table;

       VAL
----------
         2

Ожидаемое поведение:

Выбор NEXTVAL без вставки работает должным образом:

CREATE SEQUENCE test_sequence_2 START WITH 1;

SELECT test_sequence_2.NEXTVAL FROM dual

   NEXTVAL
----------
         1

Вопрос:

Может кто-нибудь воспроизвести это с помощью Oracle 11g?Это известная проблема?

Я использую
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production.

Ответы [ 4 ]

16 голосов
/ 11 ноября 2010

Это задокументировано в Справочнике по языку SQL 11.2 , где написано

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

См. Ссылку в ответе Джеффри Кемпа для заметки о поддержке Oracle (Metalink) и обходного пути.

7 голосов
/ 11 ноября 2010

Я бы сказал, что причиной является эта «недокументированная особенность».См. Мой документ поддержки Oracle с идентификатором 1273858.1 (который, к сожалению, находится за платным доступом и не может быть скопирован здесь).

Попробуйте сделать это без создания отложенного сегмента и посмотрите, сохраняется ли проблема.

3 голосов
/ 11 ноября 2010

Я не могу воспроизвести на 11G, т. Е. Таблица содержит 1 после выполнения ваших шагов.

Тем не менее, остается спорным, следует ли считать это «проблемой», потому что последовательности никогда не гарантируют отсутствие пробелов. Что START WITH гарантирует, что последовательность никогда не вернет значение ниже , чем указанное начальное значение - например, чтобы избежать конфликтов с существующими данными. Однако я согласен, что то, что вы видите, удивительно, и мне было бы интересно узнать причину!

1 голос
/ 22 сентября 2015

Использование:

CREATE SEQUENCE SQ_SEQUENCE_NAME
    INCREMENT BY 1
    START WITH 1
    MINVALUE 0  -- This will ensure start at 1!
    MAXVALUE 99
    NOCYCLE
    NOCACHE
    ORDER;
...