Montag, 23. November 2009

Howto: Auto Increment mit der Hsqdb Datenbank

Howto: Auto Increment bei der Hsqldb Datenbank

Da ich gerade die Gelegenheit hatte mich, zugegeben schon zu fortgeschrittener Stunde durch die Dokumentation der Hsqldb Datenbank zu kämpfen und mehrere Foren zu durchsuchen, die zwar auf vieles eine Antwort haben, jedoch nie genau auf das was man sucht, schreibe ich hiermit meinen ersten Blog-Eintrag. 

Die Ausgangslage stellt sich wie folgt dar. Genutzt wird eine Java Desktop Application, die diverse Werte in eine Tabelle speichern soll. Genutzt wird als Datenbank eine Hsqldb 1.8.1.1. Mit jedem Insert soll die Id des Datensatzes automatisch erhöht werden, so wie man es z.B. von einer MySQL Datenbank mit ihrem auto_increment Feature kenn.

Nehmen wir uns hier eine fiktive Tabelle, welche einfach aus einer Column für einen Wert besteht und einer Id-Column.

Tabellenname: TBL_BEISPIEL

Columns: BEI_ID, BEI_VALUE // BEI_ID wird als Primärschlüssel definiert

Um diese Tabelle anzulegen würden wir standardmäßig folgendes SQL Statement nutzen:

CREATE TABLE TBL_BEISPIEL (BEI_ID INTEGER NOT NULL PRIMARY KEY, BEI_VALUE INTEGER NOT NULL);

Die Syntax die in diesem Statement noch fehlt ist unsere gewünschte Id-Incrementierung. Laut der Hsqldb-Dokumentation lautet sie wie folgt:

INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH n, [INCREMENT BY m])

In unserem konkreten Beispiel sähe das Statement dann so aus:

CREATE TABLE TBL_BEISPIEL (BEI_ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 1, INCREMENT BY 1) NOT NULL PRIMARY KEY, BEI_VALUE INTEGER NOT NULL);

Wichtig ist hierbei bei einem Insert aus der Java Application heraus zu beachten dass dem Insert-Statement die BEI_ID Column mit einem Value von null mitgegeben wird.

z.B. INSERT INTO TBL_BEISPIEL (BEI_ID, BEI_VALUE) VALUES (null, 11111);

Durch den Null-Wert im Increment Statement wird datenbankseitig dann automatisch die Funktion IDENTITY() aufgerufen, welche den letzten Wert der ID ermittelt und erhöht.