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.:
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;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;Catalog Error:Table with name tbl does not exist!