Zum Inhalt springen

CREATE SEQUENCE-Anweisung

Die CREATE SEQUENCE-Anweisung erzeugt einen neuen Sequenznummern-Generator.

Beispiele

Eine aufsteigende Sequenz erzeugen, die bei 1 beginnt:

CREATE SEQUENCE serial;

Eine Sequenz von einer angegebenen Startnummer erzeugen:

CREATE SEQUENCE serial START 101;

Ungerade Zahlen mit INCREMENT BY erzeugen:

CREATE SEQUENCE serial START WITH 1 INCREMENT BY 2;

Eine absteigende Sequenz erzeugen, die bei 99 beginnt:

CREATE SEQUENCE serial START WITH 99 INCREMENT BY -1 MAXVALUE 99;

Standardmäßig sind Zyklen nicht erlaubt und führen zu einem Fehler, z. B.:

Terminal window
Sequence Error:
nextval: reached maximum value of sequence "serial" (10)
CREATE SEQUENCE serial START WITH 1 MAXVALUE 10;

CYCLE erlaubt das wiederholte Durchlaufen derselben Sequenz:

CREATE SEQUENCE serial START WITH 1 MAXVALUE 10 CYCLE;

Sequenzen anlegen und löschen

Sequenzen können ähnlich wie andere Katalogobjekte angelegt und gelöscht werden.

Eine vorhandene Sequenz überschreiben:

CREATE OR REPLACE SEQUENCE serial;

Die Sequenz nur anlegen, wenn noch keine solche Sequenz existiert:

CREATE SEQUENCE IF NOT EXISTS serial;

Sequenz entfernen:

DROP SEQUENCE serial;

Sequenz entfernen, falls sie existiert:

DROP SEQUENCE IF EXISTS serial;

Sequenzen für Primärschlüssel verwenden

Sequenzen können als DEFAULT-Werte in CREATE TABLE-Anweisungen verwendet werden.

Das folgende Beispiel verwendet eine Sequenz, um einen ganzzahligen Primärschlüssel anzulegen:

CREATE SEQUENCE id_sequence START 1;
CREATE TABLE tbl (id INTEGER PRIMARY KEY DEFAULT nextval('id_sequence'), s VARCHAR);
INSERT INTO tbl (s) VALUES ('hello'), ('world');
SELECT * FROM tbl;

Das Skript ergibt die folgende Tabelle:

id s
1 hello
2 world

Sequenzen können auch mit der ALTER TABLE-Anweisung hinzugefügt werden. Das folgende Beispiel fügt eine Spalte id hinzu und füllt sie mit von der Sequenz erzeugten Werten:

CREATE TABLE tbl (s VARCHAR);
INSERT INTO tbl VALUES ('hello'), ('world');
CREATE SEQUENCE id_sequence START 1;
ALTER TABLE tbl ADD COLUMN id INTEGER DEFAULT nextval('id_sequence');
SELECT * FROM tbl;

Dieses Skript ergibt dieselbe Tabelle wie das vorherige Beispiel.

Den nächsten Wert auswählen

Um die nächste Zahl aus einer Sequenz auszuwählen, verwenden Sie nextval:

CREATE SEQUENCE serial START 1;
SELECT nextval('serial') AS nextval;
nextval
1

Diese Sequenz in einem INSERT-Befehl verwenden:

INSERT INTO distributors VALUES (nextval('serial'), 'nothing');

Den aktuellen Wert auswählen

Sie können auch die aktuelle Zahl der Sequenz anzeigen. Beachten Sie, dass die Funktion nextval bereits aufgerufen worden sein muss, bevor Sie currval aufrufen, andernfalls wird ein Serialization Error (sequence is not yet defined in this session) geworfen.

CREATE SEQUENCE serial START 1;
SELECT nextval('serial') AS nextval;
SELECT currval('serial') AS currval;
currval
1

Syntax

CREATE SEQUENCE erzeugt einen neuen Sequenznummern-Generator.

Wenn ein Schemaname angegeben wird, wird die Sequenz im angegebenen Schema angelegt. Andernfalls wird sie im aktuellen Schema angelegt. Temporäre Sequenzen existieren in einem besonderen Schema, daher darf beim Anlegen einer temporären Sequenz kein Schemaname angegeben werden. Der Sequenzname muss sich vom Namen jeder anderen Sequenz im selben Schema unterscheiden.

Nachdem eine Sequenz angelegt wurde, verwenden Sie die Funktion nextval, um mit der Sequenz zu arbeiten.

Parameter

Name Beschreibung
CYCLE oder NO CYCLE Die Option CYCLE erlaubt der Sequenz, umzulaufen, wenn bei einer aufsteigenden bzw. absteigenden Sequenz maxvalue bzw. minvalue erreicht wurde. Wird die Grenze erreicht, ist die nächste erzeugte Zahl minvalue bzw. maxvalue. Ist NO CYCLE angegeben, geben Aufrufe von nextval nach Erreichen des Maximalwerts einen Fehler zurück. Sind weder CYCLE noch NO CYCLE angegeben, ist NO CYCLE der Standard.
increment Die optionale Klausel INCREMENT BY increment gibt an, welcher Wert zum aktuellen Sequenzwert addiert wird, um einen neuen Wert zu erzeugen. Ein positiver Wert ergibt eine aufsteigende Sequenz, ein negativer eine absteigende. Der Standardwert ist 1.
maxvalue Die optionale Klausel MAXVALUE maxvalue bestimmt den Maximalwert der Sequenz. Wird diese Klausel nicht angegeben oder NO MAXVALUE gesetzt, werden Standardwerte verwendet. Die Standards sind 2^63 - 1 und -1 für aufsteigende bzw. absteigende Sequenzen.
minvalue Die optionale Klausel MINVALUE minvalue bestimmt den Minimalwert, den eine Sequenz erzeugen kann. Wird diese Klausel nicht angegeben oder NO MINVALUE gesetzt, werden Standardwerte verwendet. Die Standards sind 1 und -(2^63 - 1) für aufsteigende bzw. absteigende Sequenzen.
name Der Name (optional schemaqualifiziert) der anzulegenden Sequenz.
start Die optionale Klausel START WITH start erlaubt der Sequenz, an einer beliebigen Stelle zu beginnen. Der Standardstartwert ist minvalue für aufsteigende und maxvalue für absteigende Sequenzen.
TEMPORARY oder TEMP Wenn angegeben, wird das Sequenzobjekt nur für diese Sitzung angelegt und beim Beenden der Sitzung automatisch gelöscht. Vorhandene permanente Sequenzen mit demselben Namen sind (in dieser Sitzung) nicht sichtbar, solange die temporäre Sequenz existiert, es sei denn, sie werden mit schemaqualifizierten Namen referenziert.

Sequenzen basieren auf BIGINT-Arithmetik, der Bereich kann daher den Bereich einer Acht-Byte-Ganzzahl nicht überschreiten (-9223372036854775808 bis 9223372036854775807).

Einschränkungen

Aufgrund von Einschränkungen im Abhängigkeitsmanager von DuckDB schlägt DROP SEQUENCE in manchen Randfällen fehl.

CREATE SEQUENCE id_sequence START 1;
CREATE TABLE tbl (
id INTEGER DEFAULT nextval('id_sequence'),
s VARCHAR
);
INSERT INTO tbl(s) VALUES ('default is the next value from id_sequence');
ALTER TABLE tbl ALTER COLUMN id SET DEFAULT NULL;
INSERT INTO tbl(s) VALUES ('default is NULL');
SELECT * FROM tbl;
┌───────┬────────────────────────────────────────────┐
│ id │ s │
│ int32 │ varchar │
├───────┼────────────────────────────────────────────┤
│ 1 │ default is the next value from id_sequence │
│ NULL │ default is NULL │
└───────┴────────────────────────────────────────────┘

Obwohl die Sequenz nicht mehr verwendet wird, führt der Versuch, sie zu löschen, zu einem Fehler:

DROP SEQUENCE id_sequence;
Terminal window
Dependency Error:
Cannot drop entry "id_sequence" because there are entries that depend on it.
table "tbl" depends on index "id_sequence".
Use DROP...CASCADE to drop all dependents.

Wie die Fehlermeldung vorschlägt, können Sie das Löschen mit CASCADE erzwingen. DuckDB verfolgt Abhängigkeiten derzeit jedoch auf Tabellenebene, daher löscht der Versuch mit CASCADE die gesamte Tabelle:

DROP SEQUENCE id_sequence CASCADE;
SELECT * FROM tbl;
Terminal window
Catalog Error:
Table with name tbl does not exist!