FirebirdSQL logo
 FILTEREXCEPTION 

Eine Sequenz oder — ein Generator — ist ein Datenbankobjekt, das verwendet wird, um eindeutige Zahlenwerte zum Füllen einer Reihe zu erhalten.“Sequence” ist der SQL-konforme Begriff für dasselbe, was — in Firebird — traditionell als “Generator” bekannt war.Firebird hat Syntax für beide Begriffe.

Sequenzen werden immer als 64-Bit-Ganzzahlen gespeichert, unabhängig vom SQL-Dialekt der Datenbank.

Caution

Wenn ein Client mit Dialekt 1 verbunden ist, behandelt der Server Sequenzwerte als 32-Bit-Ganzzahlen.Die Übergabe eines Sequenzwerts an ein 32-Bit-Feld oder eine 32-Bit-Variable verursacht keine Fehler, solange der aktuelle Wert der Sequenz die Grenzen einer 32-Bit-Zahl nicht überschreitet.Sobald jedoch der Sequenzwert diese Grenze überschreitet, erzeugt eine Datenbank in Dialekt 3 einen Fehler.Eine Datenbank in Dialekt 1 wird den Wert abschneiden (überlaufen), was die Einzigartigkeit der Serie beeinträchtigen könnte.

In diesem Abschnitt wird beschrieben, wie Sie Sequenzen erstellen, ändern, einstellen und löschen.

CREATE SEQUENCE

Verwendet für

Erstellen einer neuen SEQUENCE (GENERATOR)

Verfügbar in

DSQL, ESQL

Syntax
CREATE {SEQUENCE | GENERATOR} seq_name
  [START WITH start_value]
  [INCREMENT [BY] increment]
Table 1. CREATE SEQUENCE-Anweisungsparameter
Parameter Beschreibung

seq_name

Name der Sequenz (Generator).Diese kann aus bis zu 63 Zeichen bestehen

start_value

Anfangswert der Sequenz.Standard ist 1.

increment

Erhöhen der Sequenz (bei Verwendung von NEXT VALUE FOR seq_name);kann nicht 0 sein.Standard ist 1.

Die Anweisungen CREATE SEQUENCE und CREATE GENERATOR sind synonym – beide erzeugen eine neue Sequenz.Beide können verwendet werden, aber CREATE SEQUENCE wird empfohlen, da dies die im SQL-Standard definierte Syntax ist.

Wenn eine Sequenz erstellt wird, wird ihr aktueller Wert so gesetzt, dass der nächste Wert, der von NEXT VALUE FOR seq_name erhalten wird, gleich start_value ist.Mit anderen Worten, der aktuelle Wert der Sequenz wird auf (start_value - increment) gesetzt.Standardmäßig ist der start_value 1 (eins).

Mit der optionalen INCREMENT [BY]-Klausel können Sie ein Inkrement für den Ausdruck NEXT VALUE FOR seq_name angeben.Standardmäßig ist das Inkrement 1 (eins).Die Schrittweite kann nicht auf 0 (Null) gesetzt werden.Stattdessen kann die Funktion GEN_ID(seq_name, <step>) aufgerufen werden, um die Serie um eine andere ganze Zahl zu “step”.Das durch INCREMENT [BY] angegebene Inkrement wird nicht für GEN_ID verwendet.

Note
Nicht standardmäßiges Verhalten bei negativen Inkrementen

Der SQL-Standard legt fest, dass Sequenzen mit negativem Inkrement beim Maximalwert der Sequenz (263 - 1) beginnen und herunterzählen sollen.Firebird tut dies nicht und beginnt stattdessen bei 0 + Inkrement.

Dies kann sich in einer zukünftigen Firebird-Version ändern.

docnext count = 15

Wer kann eine Sequenz erstellen?

Die Anweisung CREATE SEQUENCE (CREATE GENERATOR) kann ausgeführt werden durch:

  • Administratoren

  • Benutzer mit dem Privileg CREATE SEQUENCE (CREATE GENERATOR)

Der Benutzer, der die Anweisung CREATE SEQUENCE (CREATE GENERATOR) ausführt, wird ihr Eigentümer.

Beispiel für CREATE SEQUENCE

  1. Erstellen der Sequenz EMP_NO_GEN mit CREATE SEQUENCE.

    CREATE SEQUENCE EMP_NO_GEN;
  2. Erstellen der Sequenz EMP_NO_GEN mit CREATE GENERATOR.

    CREATE GENERATOR EMP_NO_GEN;
  3. Erstellen der Sequenz EMP_NO_GEN mit einem Anfangswert von 5 und einem Inkrement von 1.

    CREATE SEQUENCE EMP_NO_GEN START WITH 5;
  4. Erstellen der Sequenz EMP_NO_GEN mit einem Anfangswert von 1 und einem Inkrement von 10.

    CREATE SEQUENCE EMP_NO_GEN INCREMENT BY 10;
  5. Erstellen der Sequenz EMP_NO_GEN mit einem Anfangswert von 5 und einem Inkrement von 10.

    CREATE SEQUENCE EMP_NO_GEN START WITH 5 INCREMENT BY 10;

ALTER SEQUENCE

Verwendet für

Den nächsten Wert einer Sequenz setzen oder deren Inkrement ändern

Verfügbar in

DSQL

Syntax
ALTER {SEQUENCE | GENERATOR} seq_name
  [RESTART [WITH newvalue]]
  [INCREMENT [BY] increment]
Table 1. ALTER SEQUENCE-Anweisungsparameter
Parameter Beschreibung

seq_name

Name der Sequenz (Generator)

newvalue

Neuer Sequenz-(Generator-)Wert.Eine 64-Bit-Ganzzahl von -2-63 bis 263-1.

increment

Erhöhen der Sequenz (bei Verwendung von NEXT VALUE FOR seq_name);kann nicht 0 sein.

Die ALTER SEQUENCE-Anweisung setzt den aktuellen Wert einer Sequenz oder eines Generators auf den angegebenen Wertund/oder ändert das Inkrement der Sequenz.

Mit der RESTART WITH newvalue-Klausel können Sie den nächsten von NEXT VALUE FOR seq_name generierten Wert setzen.Um dies zu erreichen, wird der aktuelle Wert der Sequenz entweder wie in der Anweisung angegeben auf (newvalue - increment) mit increment gesetzt oder in den Metadaten der Sequenz gespeichert.Die RESTART-Klausel (ohne WITH) startet die Sequenz mit dem in den Metadaten der Sequenz gespeicherten Anfangswert neu.

Note

Im Gegensatz zu Firebird 3.0 startet in Firebird 4.0 RESTART WITH newvalue die Sequenz nur mit dem angegebenen Wert neu und speichert newvalue nicht als neuen Anfangswert der Sequenz.Ein nachfolgender ALTER SEQUENCE RESTART verwendet den Anfangswert, der beim Erstellen der Sequenz angegeben wurde, und nicht den newvalue dieser Anweisung.Dieses Verhalten ist im SQL-Standard spezifiziert.

Es ist derzeit nicht möglich, den in den Metadaten gespeicherten Initialwert zu ändern.

Warning

Eine falsche Verwendung der ALTER SEQUENCE-Anweisung (Änderung des aktuellen Wertes der Sequenz oder des Generators) kann die logische Integrität der Daten verletzen oder zu Verletzungen von Primärschlüssel- oder Unique-Constraints führen.

Mit INCREMENT [BY] können Sie das Sequenzinkrement für den NEXT VALUE FOR-Ausdruck ändern.

Note

Das Ändern des Inkrementwerts wird für alle Abfragen wirksam, die nach dem Festschreiben der Transaktion ausgeführt werden.Prozeduren, die zum ersten Mal nach dem Ändern des Commits aufgerufen werden, verwenden den neuen Wert, wenn sie NEXT VALUE FOR verwenden.Prozeduren, die bereits verwendet (und im Metadaten-Cache zwischengespeichert wurden) verwenden weiterhin das alte Inkrement.Möglicherweise müssen Sie alle Verbindungen zur Datenbank schließen, damit der Metadatencache gelöscht und das neue Inkrement verwendet werden kann.Prozeduren, die NEXT VALUE FOR verwenden, müssen nicht neu kompiliert werden, um das neue Inkrement zu sehen.Prozeduren, die GEN_ID(gen, expression) verwenden, sind nicht betroffen, wenn das Inkrement geändert wird.

Wer kann eine Sequenz ändern?

Die Anweisung ALTER SEQUENCE (ALTER GENERATOR) kann ausgeführt werden durch:

  • Administratoren

  • Der Besitzer der Sequenz

  • Benutzer mit dem Privileg ALTER ANY SEQUENCE (ALTER ANY GENERATOR)

Beispiele für ALTER SEQUENCE

  1. Den Wert der EMP_NO_GEN-Sequenz so einstellen, dass der nächste Wert 145 ist.

    ALTER SEQUENCE EMP_NO_GEN RESTART WITH 145;
  2. Zurücksetzen des Basiswerts der Sequenz EMP_NO_GEN auf den in den Metadaten gespeicherten Initialwert

    ALTER SEQUENCE EMP_NO_GEN RESTART;
  3. Ändern der Schrittweite der Sequenz EMP_NO_GEN auf 10

    ALTER SEQUENCE EMP_NO_GEN INCREMENT BY 10;

CREATE OR ALTER SEQUENCE

Verwendet für

Erstellen einer neuen oder Ändern einer bestehenden Sequenz

Verfügbar in

DSQL, ESQL

Syntax
CREATE OR ALTER {SEQUENCE | GENERATOR} seq_name
  {RESTART | START WITH start_value}
  [INCREMENT [BY] increment]
Table 1. CREATE OR ALTER SEQUENCE-Anweisungsparameter
Parameter Beschreibung

seq_name

Name der Sequenz (Generator).Diese kann aus bis zu 63 Zeichen bestehen

start_value

Anfangswert der Sequenz.Standard ist 1

increment

Erhöhen der Sequenz (bei Verwendung von NEXT VALUE FOR seq_name);kann nicht 0 sein.Standard ist 1.

Wenn die Sequenz nicht existiert, wird sie erstellt.Eine bestehende Sequenz wird geändert:

  • Wenn RESTART angegeben ist, wird die Sequenz mit dem in den Metadaten gespeicherten Anfangswert neu gestartet

  • Wenn die START WITH-Klausel angegeben ist, wird die Sequenz mit start_value neu gestartet, aber der start_value wird nicht gespeichert.Mit anderen Worten, es verhält sich wie RESTART WITH in [fblangref40-ddl-sequence-alter-de].

  • Wenn die INCREMENT [BY]-Klausel angegeben ist, wird increment als Inkrement in den Metadaten gespeichert und für nachfolgende Aufrufe von NEXT VALUE FOR verwendet

Beispiel für SEQUENZ ERSTELLEN ODER ÄNDERN

Erstelle eine neue oder modifiziere eine bestehende Sequenz EMP_NO_GEN
CREATE OR ALTER SEQUENCE EMP_NO_GEN
  START WITH 10
  INCREMENT BY 1

DROP SEQUENCE

Verwendet für

Löschen einer Sequenz SEQUENCE (GENERATOR)

Verfügbar in

DSQL, ESQL

Syntax
DROP {SEQUENCE | GENERATOR} seq_name
Table 1. DROP SEQUENCE-Anweisungsparameter
Parameter Beschreibung

seq_name

Name der Sequenz (Generator).Diese kann aus bis zu 63 Zeichen bestehen

Die Anweisungen DROP SEQUENCE und DROP GENERATOR sind äquivalent: beide löschen eine existierende Sequenz (Generator).Beides ist gültig, aber DROP SEQUENCE wird empfohlen, da es im SQL-Standard definiert ist.

Die Anweisungen schlagen fehl, wenn die Sequenz (Generator) Abhängigkeiten hat.

Wer kann eine Sequenz löschen?

Die Anweisung DROP SEQUENCE (DROP GENERATOR) kann ausgeführt werden durch:

  • Administratoren

  • Der Besitzer der Sequenz

  • Benutzer mit dem Privileg DROP ANY SEQUENCE (DROP ANY GENERATOR)

Beispiel für DROP SEQUENCE

Löschen der EMP_NO_GEN-Reihe:
DROP SEQUENCE EMP_NO_GEN;

RECREATE SEQUENCE

Verwendet für

Sequenz erstellen oder neu erstellen (Generator)

Verfügbar in

DSQL, ESQL

Syntax
RECREATE {SEQUENCE | GENERATOR} seq_name
  [START WITH start_value]
  [INCREMENT [BY] increment]
Table 1. RECREATE SEQUENCE-Anweisungsparameter
Parameter Beschreibung

seq_name

Name der Sequenz (Generator).Diese kann aus bis zu 63 Zeichen bestehen

start_value

Anfangswert der Sequenz

increment

Erhöhen der Sequenz (bei Verwendung von NEXT VALUE FOR seq_name);kann nicht 0 sein

Siehe [fblangref40-ddl-sequence-create-de] für die vollständige Syntax von CREATE SEQUENCE und Beschreibungen zur Definition einer Sequenz und ihrer Optionen.

RECREATE SEQUENCE erstellt oder erstellt eine Sequenz neu.Existiert bereits eine Sequenz mit diesem Namen, versucht die RECREATE SEQUENCE-Anweisung, sie zu löschen und eine neue zu erstellen.Vorhandene Abhängigkeiten verhindern die Ausführung der Anweisung.

Beispiel für RECREATE SEQUENCE

Neuerstellen der Sequenz EMP_NO_GEN
RECREATE SEQUENCE EMP_NO_GEN
  START WITH 10
  INCREMENT BY 2;

SET GENERATOR

Verwendet für

Setzen des aktuellen Werts einer Sequenz oder eines Generators auf einen bestimmten Wert

Verfügbar in

DSQL, ESQL

Syntax
SET GENERATOR seq_name TO new_val
Table 1. SET GENERATOR-Anweisungsparameter
Parameter Beschreibung

seq_name

Name des Generators (Sequenz)

new_val

Neuer Sequenz-(Generator-)Wert.Eine 64-Bit-Ganzzahl von -2-63 bis 263-1.

Die Anweisung SET GENERATOR setzt den aktuellen Wert einer Sequenz oder eines Generators auf den angegebenen Wert.

Note

Obwohl SET GENERATOR als veraltet gilt, wird es aus Gründen der Abwärtskompatibilität beibehalten.Die Verwendung der standardkonformen ALTER SEQUENCE wird empfohlen.

Wer kann einen SET GENERATOR verwenden?

Die SET GENERATOR-Anweisung kann ausgeführt werden durch:

  • Administratoren

  • Der Besitzer der Sequenz (Generator)

  • Benutzer mit dem Privileg ALTER ANY SEQUENCE (ALTER ANY GENERATOR)

Beispiel für SET GENERATOR

Wert der Sequenz EMP_NO_GEN auf 145 setzen:
SET GENERATOR EMP_NO_GEN TO 145;
Note

Ähnliche Effekte lassen sich mit [fblangref40-ddl-sequence-alter-de] erzielen:

ALTER SEQUENCE EMP_NO_GEN
  RESTART WITH 145 + increment;

Der Wert von increment ist hier das aktuelle Inkrement der Sequenz.Wir müssen es hinzufügen, da ALTER SEQUENCE den aktuellen Wert berechnet, der basierend auf dem nächsten Wert, den es erzeugen soll, gesetzt werden soll.