2010-11-11 6 views
11

Неожиданное поведение:Oracle Последовательность, начиная с 2 вместо 1

Я встречая странное поведение последовательностей Oracle с 11g (работает с 10г):

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

INSERT INTO test_table VALUES (test_sequence.NEXTVAL); 

Даже несмотря на то, последовательность начинается с , первое введенное значение: :

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.

+1

Он возвращает '1' в моем' Oracle Database 11g Release 11.1.0.6.0 - 64-битную Production' – Quassnoi

+1

@Quassnoi: Это, кажется, быть "особенность" '11.2 '(см. ответ Джеффри). Спасибо за тестирование! –

ответ

16

Это documented in the 11.2 SQL Language Reference, где он говорит,

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

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

3

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

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

7

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

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

1

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

CREATE SEQUENCE SQ_SEQUENCE_NAME 
    INCREMENT BY 1 
    START WITH 1 
    MINVALUE 0 -- This will ensure start at 1! 
    MAXVALUE 99 
    NOCYCLE 
    NOCACHE 
    ORDER; 
Смежные вопросы