Sequenzen

Sequenzen haben wir im Zusammenhang mit serial und serial8 bereits einmal kennengelernt. Sequenzen ermöglichen es, eindeutige Nummern zu erzeugen. Eindeutig bedeutet in diesem Zusammenhang, dass keine Nummer doppelt vergeben wird - eindeutig bedeutet aber nicht, dass die Nummern immer unterbrechungsfrei sind.

Zum Erzeugen einer Sequenz kann das Kommando CREATE SEQUENCE verwendet werden:

test=# \h CREATE SEQUENCE
Command:     CREATE SEQUENCE
Description: define a new sequence generator
Syntax:
CREATE [ TEMPORARY | TEMP ] SEQUENCE name [ INCREMENT [ BY ] increment ]
    [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
    [ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]

Sequences bieten einige interessante Möglichkeiten. Bevor wir uns den Details zuwenden, wollen wir eine einfache Sequence ansehen:

test=# CREATE SEQUENCE seq_a;
CREATE SEQUENCE

Die Funktion nextval ermöglich das Abfragen eines Wertes aus der Sequence:

test=# SELECT nextval('seq_a');
 nextval
---------
       1
(1 row)

test=# SELECT nextval('seq_a');
 nextval
---------
       2
(1 row)

test=# SELECT nextval('seq_a');
 nextval
---------
       3
(1 row)

Durch jeden Aufruf von nextval, wird die Sequence um einen Wert erhöht. Auf diese Weise erhalten Sie eine durchgehende Zahlenreihe.

Um den Zustand einer Sequenz abzufragen, können Sie auch wie mit einer normalen Tabelle operieren:

test=# SELECT sequence_name, last_value, increment_by, max_value FROM seq_a;
 sequence_name | last_value | increment_by |      max_value
---------------+------------+--------------+---------------------
 seq_a         |          3 |            1 | 9223372036854775807
(1 row)

test=# SELECT min_value, cache_value, log_cnt, is_cycled, is_called FROM
seq_a;
 min_value | cache_value | log_cnt | is_cycled | is_called
-----------+-------------+---------+-----------+-----------
         1 |           1 |      31 | f         | t
(1 row)

Wie Sie sehen können, verfügt die Sequenz über einige Attribute, auf die man bei der täglichen Arbeit zurückgreifen kann:

last_value gibt an, welchen Wert die Sequenz zuletzt angenommen hat. increment_by definiert, in welchen Schritten die Werte erhöht werden - es ist also möglich anzugeben, dass beispielsweise in 10er Schritten inkrementiert werden soll. Jede Sequenz verlässt irgendwann den gültigen Wertebereich. Standardmäßig wird der Wertebereich von einer 8-Byte Integer Variable herangezogen - es ist aber auch möglich diesen Wert niedriger anzusetzen. Wenn Sie eingeschränkte Wertebereiche verwenden wollen, ist das Feld is_cycled von Bedeutung: Ist dieses Feld eingeschaltet, beginnt die Sequenz nach einem Überlauf wieder von vorne - ist das Feld 'false', ist das nicht der Fall.

In vielen Fällen kann es notwendig sein, eine Sequenz auf einen bestimmten Wert zu setzen. In PostgreSQL kann man das mit Hilfe von setval erledigen:

test=# SELECT setval('seq_a', 1000);
 setval
--------
   1000
(1 row)

test=# SELECT nextval('seq_a');
 nextval
---------
    1001
(1 row)

Nach dem Aufruf von setval wird nextval wieder auf den nächsten Wert gesetzt.

Zum Entfernen einer Sequenz können Sie DROP SEQUENCE verwenden:

test=# \h DROP SEQUENCE
Command:     DROP SEQUENCE
Description: remove a sequence
Syntax:
DROP SEQUENCE name [, ...] [ CASCADE | RESTRICT ]

Praktisch sieht das dann so aus:

test=# DROP SEQUENCE seq_a;
DROP SEQUENCE


Cybertec Schönig & Schönig GmbH
PostgreSQL support, training, consulting
www.postgresql-support.de