12 Stimmen

Oracle Sequence beginnend mit 2 statt 1

Unerwartetes Verhalten:

Ich stoße auf ein seltsames Verhalten von Oracle-Sequenzen mit 11g (funktioniert mit 10g):

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

INSERT INTO test_table VALUES ( test_sequence.NEXTVAL );

Auch wenn die Sequenz mit 1 ist der erste eingefügte Wert 2 :

SELECT * FROM test_table;

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

Erwartetes Verhalten:

Auswahl von NEXTVAL ohne die Einfügung funktioniert wie erwartet:

CREATE SEQUENCE test_sequence_2 START WITH 1;

SELECT test_sequence_2.NEXTVAL FROM dual

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

Frage:

Kann jemand dieses Problem mit Oracle 11g reproduzieren? Ist dies ein bekanntes Problem?

Ich benutze
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production .

16voto

Leigh Riffel Punkte 6073

Dies ist dokumentiert in der 11.2 SQL-Sprachreferenz wo es heißt,

Wenn Sie versuchen, einen Sequenzwert in eine Tabelle einzufügen, die eine verzögerte Segmenterstellung verwendet, wird der erste Wert, den die Sequenz zurückgibt, übersprungen.

Unter dem Link in der Antwort von Jeffrey Kemp finden Sie einen Hinweis auf My Oracle Support (Metalink) und eine Problemumgehung.

7voto

Jeffrey Kemp Punkte 57542

Ich würde sagen, die Ursache ist diese "undokumentierte Funktion". Siehe My Oracle Support Document ID 1273858.1 (das sich leider hinter einer Paywall befindet und hier nicht kopiert werden kann).

Versuchen Sie es ohne zeitversetzte Segmenterstellung und sehen Sie, ob das Problem weiterhin besteht.

3voto

Tony Andrews Punkte 125904

Ich kann es auf 11G nicht reproduzieren, d. h. die Tabelle enthält eine 1, nachdem ich Ihre Schritte befolgt habe.

Es ist jedoch fraglich, ob dies als "Problem" betrachtet werden sollte, da Sequenzen nie garantiert lückenlos sind. Was START WITH garantiert, ist, dass die Sequenz niemals einen Wert zurückgeben wird unter als der angegebene Startwert - z. B. um Konflikte mit bestehenden Daten zu vermeiden. Ich stimme jedoch zu, dass das, was Sie sehen, überraschend ist, und es würde mich interessieren, den Grund dafür zu erfahren!

2voto

Leomir Andrade Punkte 21

Verwendung:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X