| PostgreSQL: Das Offizielle Handbuch | ||||
|---|---|---|---|---|
| Zurück | Schnell zurück | Schnell nach vorne | Nach vorne | |
CREATE [ TEMPORARY | TEMP ] SEQUENCE seqname [ INCREMENT inkrement ]
[ MINVALUE minwert ] [ MAXVALUE maxwert ]
[ START start ] [ CACHE cache ] [ CYCLE ]CREATE SEQUENCE erzeugt einen neuen Sequenzgenerator. Dazu wird eine neue spezielle einzeilige Tabelle mit dem Namen seqname erzeugt und initialisiert. Der Eigentümer des Sequenzgenerators wird der Benutzer sein, der den Befehl ausführt.
Wenn ein Schemaname angegeben wurde (zum Beispiel CREATE SEQUENCE mein_schema.meine_sequenz ...), dann wird die Sequenz im angegeben Schema erzeugt, ansonsten wird sie im aktuellen Schema erzeugt. Temporäre Sequenzen existieren in einem besonderen Schema, also darf bei der Erzeugung einer temporären Sequenz kein Schemaname angegeben werden. Der Sequenzname muss sich von den Namen aller Sequenzen, Tabellen, Indexe und Sichten im selben Schema unterscheiden.
Nachdem eine Sequenz erzeugt worden ist, kann man mit den Funktionen nextval, currval und setval auf sie zugreifen und sie bearbeiten. Diese Funktionen sind in Abschnitt 9.11 beschrieben.
Obwohl man eine Sequenz nicht direkt aktualisieren kann, können Sie mit einer Anfrage wie
SELECT * FROM seqname;
die Parameter und den aktuellen Zustand der Sequenz einsehen. Insbesondere zeigt das Feld last_value einer Sequenz den letzten von irgendeiner Sitzung erzeugten Wert. (Natürlich könnte dieser Wert bei der Ausgabe schon veraltet sein, wenn andere Sitzungen währenddessen nextval aufrufen.)
Wenn angegeben, dann wird das Sequenzobjektobjekt nur für diese Sitzung erzeugt und wird automatisch entfernt, wenn die Sitzung beendet wird. Bestehende permanente Sequenzen mit dem selben Namen sind (in dieser Sitzung) nicht sichtbar, solange die temporäre Sequenz existiert, außer wenn man auf sie mit schemaqualifizierten Namen zugreift.
Der Name der zu erzeugenden Sequenz (möglicherweise mit Schemaqualifikation).
Die optionale Klausel INCREMENT inkrement gibt an, welcher Wert zum aktuellen Sequenzwert addiert wird um einen neuen Wert zu ermitteln. Ein positiver Wert ergibt eine wachsende Sequenz, ein negativer eine fallende Sequenz. Der Vorgabewert ist 1.
Die optionale Klausel MINVALUE minwert gibt den niedrigsten Wert an, den die Sequenz erzeugen kann. Die Vorgabewerte sind 1 für wachsende Sequenzen und -263-1 für fallende Sequenzen.
Die optionale Klausel MAXVALUE maxwert gibt den höchsten Wert an, den die Sequenz erzeugen kann. Die Vorgabewerte sind 263-1 für wachsende Sequenzen und -1 für fallende Sequenzen.
Mit der optionalen Klausel START start kann die Sequenz mit einer beliebigen Zahl beginnen. Der Standardanfangswert ist minwert für wachsende Sequenzen und maxwert für fallende Sequenzen.
Die optionale Klausel CACHE cache gibt an, wie viele Sequenzzahlen im Vorab erzeugt und für schnelleren Zugriff im Cache zwischengespeichert werden sollen. Der Mindestwert ist 1 (nur ein Wert wird auf einmal erzeugt, d.h. kein Cache) und das ist auch der Vorgabewert.
Die Option CYCLE erlaubt der Sequenz beim Erreichen von maxwert oder minwert am anderen Ende des Wertebereichs wieder anzufangen. Wenn die Grenze überschritten wird, dann wird der nächste erzeugte Sequenzwert minwert bzw. maxwert sein. Wenn die Grenze erreicht ist, aber CYCLE nicht angegeben wurde, dann ergeben darauf folgende Aufrufe von nextval einen Fehler.
Meldung, wenn der Befehl erfolgreich war.
Eine Sequenz, Tabelle, Sicht oder ein Index mit dem angegebenen Namen existiert bereits.
Der angegebene Startwert liegt außerhalb des gültigen Bereichs.
Die Minimum- und Maximumwerte widersprechen einander.
Die Arithmetik von Sequenzen wird mit dem Typ bigint durchgeführt, also kann der Bereich nicht außerhalb des Bereichs einer 8-Byte-Ganzzahl liegen (-9223372036854775808 bis +9223372036854775807). Wenn auf älteren Plattformen der Compiler 8-Byte-Ganzzahlen nicht unterstützt, dann haben Sequenzen den Gültigkeitsbereich des Typs integer (-2147483648 bis +2147483647).
Es kann unerwartete Ergebnisse geben, wenn die Einstellung für cache größer als 1 ist und die Sequenz von mehr als einer Sitzung gleichzeitig verwendet wird. Jede Sitzung wird bei einem Zugriff auf die Sequenz mehrere aufeinander folgende Sequenzwerte abrufen und zwischenspeichern und das Feld last_value der Sequenz entsprechen setzen. Danach liefern die nächsten cache-1 Aufrufe von nextval einfach die zwischengespeicherten Werte ab, ohne das Sequenzobjekt zu bemühen. Daher sind alle zwischengespeicherten aber nicht verwendeten Zahlen am Ende der Sitzung verloren, wodurch sich „Löcher“ in der von der Sequenz erzeugten Zahlenfolge ergeben.
Außerdem kann es sein, dass, wenn man alle Sitzungen betrachtet, die Werte nicht in Reihe zurückgeben werden; trotzdem erhalten alle Sitzungen garantiert unterschiedliche Werte. Zum Beispiel: Der Cachewert ist 10. Sitzung A reserviert vielleicht die Werte 1 bis 10 und gibt aus nextval 1 zurück. Sitzung B reserviert dann vielleicht die Werte 11 bis 20 und gibt aus nextval 11 zurück, bevor Sitzung A aus nextval 2 zurückgegeben hat. Mit einer Cache-Einstellung von 1 kann man sicher sein, dass alle nextval-Werte der Reihe nach zurückgegeben werden; mit einer Cache-Einstellung größer als 1 sollte man nur davon ausgehen, dass alle Werte unterschiedlich sind, aber nicht der Reihe nach zurückgegeben werden. Außerdem zeigt last_value den letzten Wert an, den irgendeine Sitzung reserviert hat, egal ob dieser schon von nextval zurückgegeben wurde.
Eine andere Folge daraus ist, dass ein Aufruf von setval bei einer solchen Sequenz von anderen Sitzungen erst berücksichtigt wird, wenn diese alle vorab reservierten Werte aufgebraucht haben.
Der folgende Befehl erzeugt eine wachsende Sequenz namens zahlenfolge, die bei 101 anfängt:
CREATE SEQUENCE zahlenfolge START 101;
Der folgende Befehl ermittelt die nächste Zahl dieser Sequenz:
SELECT nextval('zahlenfolge');
Hier wird diese Sequenz in einem INSERT-Befehl verwendet:
INSERT INTO händler VALUES (nextval('zahlenfolge'), 'irgendwas');
Hier wird die Sequenz nach einem COPY FROM aktualisiert:
BEGIN;
COPY händler FROM 'eingabedatei';
SELECT setval('zahlenfolge', max(nr)) FROM händler;
END;
| Zurück | Zum Anfang | Nach vorne |
| CREATE SCHEMA | Nach oben | CREATE TABLE |