Autoincrement Fields

Aus DBWiki
Wechseln zu: Navigation, Suche

Im Gegensatz zu anderen RDBMS (z.B. PostgreSQL : bigserial) besitzt Firebird keinen AutoIncrement Datentyp. Allerdings kann aus einer Kombination aus einem Generator (ab Firebird 2.0 : Sequence) und einem OnBeforeInsert Trigger ein solcher Datentyp simuliert werden.

Ein Generator stellt einen 64bit LongInteger Wert zur Verfügung, daher sollte das simulierte AutoIncrement Feld vom Typ BigInt sein. Ob für jede Tabelle ein eigener Generator, oder ein Generator für mehrere Tabellen definiert wird, hängt vom Gesamtdesign ab. Beides kann sinnvoll sein.

Codebeispiel

Definition eines Generators mit dem Namen GEN_TBL_TEST_ID

CREATE GENERATOR GEN_TBL_TEST_ID;

Tabellendefinition. Die Felder NAME und CAPTION haben in Bezug auf die Implementierung des AutoIncrement Feldes keine Bedeutung:

CREATE TABLE TBL_TEST (
     ID       BIGINT NOT NULL CHECK (VALUE > 0),
     NAME     VARCHAR(64),
     CAPTION  VARCHAR(64)
);


Definiton des OnBeforeInsert Triggers. Er wird jedesmal ausgelöst bevor ein neuer Datensatz eingefügt wird. Sollte der Wert des neu einzufügenden Feldes ID NULL sein, so wird dem Feld der aktuelle Wert den Generators zugewiesen, und anschließend der Wert des Generators um 1 erhöht.

CREATE TRIGGER TBL_TEST_BI FOR TBL_TEST
 ACTIVE BEFORE INSERT POSITION 0
 AS
 BEGIN
   IF (NEW.ID IS NULL) THEN
     NEW.ID = GEN_ID(GEN_TBL_TEST_ID,1);
END