Firebird DokumentationFirebird Datenbank DokumentationFirebird Generatoren-Ratgeber → SQL-Befehle für Generatoren
Firebird home Firebird home Zurück: Generatoren: GrundlagenZum Anfang: Firebird DokumentationNach oben: Firebird Generatoren-RatgeberWeiter: Generatoren zum Erzeugen eindeutiger Datensatz-IDs

SQL-Befehle für Generatoren

Befehlsüberblick
Verwendung der Generator-Befehle

Befehlsüberblick

Der Name des Generators muss ein üblicher Bezeichner für DB-Objekte sein: 31 Zeichen Maximallänge, keine Sonderzeichen mit Ausnahme des Unterstrichs „_“ (es sei denn, man verwendet "delimited identifier", d.h. Bezeichner in Anführungsstrichen). Die SQL-Befehle für Generatoren sind unten aufgeführt. Ihre Verwendung wird detailliert im Abschnitt Verwendung der Generator-Befehle beschrieben.

DDL (Data Definition Language) - Befehle:

CREATE GENERATOR <name>;
SET GENERATOR <name> TO <value>;
DROP GENERATOR <name>;

DML (Data Manipulation Language) Befehle in Client-seitigem SQL:

SELECT GEN_ID( <GeneratorName>, <increment> ) FROM RDB$DATABASE;

DML Anweisungen in PSQL (Procedural SQL, verfügbar in Stored Procedures und Triggern):

<intvar> = GEN_ID( <GeneratorName>, <increment> );

Für Firebird 2 empfohlene Syntax

Auch wenn die traditionelle Syntax weiter unterstützt wird, sind dies die für Firebird 2 bevorzugten Äquivalente der DDL-Befehle:

CREATE SEQUENCE <name>;
ALTER SEQUENCE <name> RESTART WITH <value>;
DROP SEQUENCE <name>;

Und für die DML-Befehle:

SELECT NEXT VALUE FOR <SequenceName> FROM RDB$DATABASE;
<intvar> = NEXT VALUE FOR <SequenceName>;

Derzeit unterstützt die neue Syntax ausschliesslich ein Inkrement von 1. Diese Einschränkung wird in einer zukünftigen Version aufgehoben. In der Zwischenzeit kann man die GEN_ID-Syntax nutzen, falls man einen anderen Inkrement benötigt.

Verwendung der Generator-Befehle

Die Verfügbarkeit der Befehle und Funktionen hängt davon ab, wo man sie benutzt:

  • In Client-seitigem SQL – die Sprache, in der der Client mit dem Firebird-Server kommuniziert.

  • PSQL – Die Server-seitige Programmiersprache, die in Stored Procedures und Triggern verwendet wird.

Einen Generator erzeugen („Insert“)

Client SQL
CREATE GENERATOR <GeneratorName>;

Für Firebird 2 und höher bevorzugt:

CREATE SEQUENCE <SequenceName>;
PSQL

Nicht möglich. Da man die Metadaten der Datanbank innerhalb von SPs und Triggern nicht ändern kann, kann man hier auch keine Generatoren erzeugen

Anmerkung

Seit FB 1.5 und aufwärts kann man dies durch die Verwendung des EXECUTE STATEMENT-Features umgehen.

Den aktuellen Wert abfragen („Select“)

Client SQL
SELECT GEN_ID( <GeneratorName>, 0 ) FROM RDB$DATABASE;

Diese Syntax ist auch in Firebird 2 derzeit die einzige Option.

Anmerkung

In Firebird's Kommandozeilen-Werkzeug isql gibt es zwei weitere Befehle zum Auslesen der aktuellen Generatorwerte::

SHOW GENERATOR <GeneratorName>;
SHOW GENERATORS;

Der erstere zeigt den aktuellen Wert des angegeben Generators, letzterer tut dies für alle Nicht-System-Generatoren in der Datenbank.

Die für Firebird 2 bevorzugten Äquivalente sind, man ahnt es schon:

SHOW SEQUENCE <SequenceName>;
SHOW SEQUENCES;

Nochmals der Hinweis: Diese SHOW-Befehle stehen nur in isql zur Verfügung. Anders als GEN_ID, können sie nicht in Client-seitigem SQL verwendet werden (es sei denn, die Client-Anwendung ist eine isql-Oberfläche oder Frontend).

PSQL
<intvar> = GEN_ID( <GeneratorName>, 0 );

Firebird 2: Gleiche Syntax.

Den nächsten Wert generieren („Update“ + „Select“)

Genau wie das Ermitteln des aktuellen Werts wird dies mittels GEN_ID errecicht, diesmal aber mit einem Inkrement von 1. Firebird wird:

  1. den aktuellen Generatorwert holen;

  2. ihn um 1 inkrementieren (und speichern);

  3. den inkrementierten Wert zurückliefern

Client SQL
SELECT GEN_ID( <GeneratorName>, 1 ) FROM RDB$DATABASE;

Die neue, für Firebird 2 empfohlene Syntax, ist völlig verschieden:

SELECT NEXT VALUE FOR <SequenceName> FROM RDB$DATABASE;
PSQL
<intvar> = GEN_ID( <GeneratorName>, 1 );

Für Firebird 2 und höher bevorzugte Syntax:

<intvar> = NEXT VALUE FOR <SequenceName>;

Einen Generator direkt auf einen bestimmten Wert setzen („Update“)

Client SQL
SET GENERATOR <GeneratorName> TO <NewValue>;

Dies ist nützlich, um einen Generator auf einen anderen als den Standardwert 0, nach der Erzeugung vorzubelegen, z.B. in einem Skript, um die Datenbank zu erzeugen. Genau wie CREATE GENERATOR ist dies ein DDL- und kein DML-Befehl.

Für Firebird 2 und höher bevorzugte Syntax:

ALTER SEQUENCE <SequenceName> RESTART WITH <NewValue>;
PSQL
GEN_ID( <GeneratorName>, <NewValue> - GEN_ID( <GeneratorName>, 0 ) );

Warnung

Dies ist mehr ein mieser kleiner Trick um etwas zu tun, was man in SPs und Triggern niemals tun sollte: Generatoren (über-)schreiben. Sie sind zum Generieren (Lesen) und nicht zum Setzen (Schreiben) da.

Einen Generator löschen („Delete“)

Client SQL
DROP GENERATOR <GeneratorName>;

Für Firebird 2 und höher bevorzugte Syntax:

DROP SEQUENCE <SequenceName>;
PSQL

Nicht möglich, es sei denn... (Gleiche Erklärung wie bei CREATE: man kann - oder besser: sollte keine Änderung an den Metadaten in PSQL vornehmen).

Einen Generator zu Löschen gibt den von ihm belegten Platz, für die Verwendung durch einen neuen Generator, nicht wieder frei. In der Praxis stört dies kaum, da kaum eine Datenbank die Zigtausend Generatoren braucht, die Firebird zulässt, so dass es immer noch genügend Platz für neue gibt. Sollte die Datenbank aber doch Gefahr laufen, die 32767er Grenze zu erreichen, kann man den verbrauchten Platz durch einen Backup-Restore-Zyklus wiedergewinnen. Dies wird die RDB$GENERATORS-Tabelle komprimieren, unter Zuweisung einer neuen, lückenlosen Reihe von IDs. Abhängig von der Situation kann die wiederhergestellte Datenbank unter Umständen auch weniger Seiten zur Speicherung der Generatorwerte brauchen.

Generatoren in älteren IB- und Firebird-Versionen löschen

Sowohl InterBase 6 und frühere als auch frühe Prä-1.0-Firebird-Versionen kennen keinen DROP GENERATOR-Befehl. Die einzige Möglichkeit zum Löschen eines Generators in diesen Versionen ist:

DELETE FROM RDB$GENERATORS WHERE RDB$GENERATOR_NAME = '<GeneratorName>';

...gefolgt von einem Backup und Restore.

In diesen Versionen war es durch die auf wenige hundert begrenzte Anzahl verfügbarer Generatoren wahrscheinlicher, dass man den Platz für gelöschte Generatoren durch Backup/Restore zurückgewinnen musste.

Zurück: Generatoren: GrundlagenZum Anfang: Firebird DokumentationNach oben: Firebird Generatoren-RatgeberWeiter: Generatoren zum Erzeugen eindeutiger Datensatz-IDs
Firebird DokumentationFirebird Datenbank DokumentationFirebird Generatoren-Ratgeber → SQL-Befehle für Generatoren