# DB erstellen und initialisieren



## Angel4585 (13. Okt 2007)

Hallo,

ich möchte ne H2 embedded DB verwenden und stehe gerade vor folgendem Problem:

Die Datenbank bzw einzelne Tabellen sollen beim Erzeugen mit Standardeinträgen gefüllt werden.
Wie kann ich das machen, das 
a)die Tabellen nur einmal angelegt werden ( ich denke da zB an create table if not exists)
b)diese Standardeinträge nicht bei jedem Programmstartreingeschrieben werden

gibts ne Möglichkeit mehrere SQL-Statements aneinanderzuhängen, etwa so:

create
insert
insert
insert
insert

und die inserts nur auszuführen wenn das create die Tabelle erzeugt hat?


----------



## Guest (13. Okt 2007)

Lass am besten beim Programmstart eine Art Integritätscheck laufen und lege die Datenbank an, 
wenn sie nicht bereits existiert und initialisiert ist.

Ob bestimmte Tabellen existieren, kannst du über die Metadaten der Verbindung ermitteln oder auch
anhand einer einfachen Select-Query.


```
DatabaseMetaData databaseMetaData = connection.getMetaData();
ResultSet rs = databaseMetaData.getTables(null, null, "%", new String[]{"TABLE"});
```


----------



## robertpic71 (15. Okt 2007)

Ab einer gewissen Größenordnung empfiehlt sich eine Versionsnummer in der Datenbank. Also eine Configdatei wo irgendwo die Versionsnummer drinnen steht. 

Die Versionsnummer kann man dann auch für Updates verwenden. Wenn ein neue Programmversion startet und feststellt, dass die Datenbank ein Version älter ist, wird das Update angeworfen.

SQL-Statements für Insert und Upgrade
 
Ich lese mir die SQL-Befehle immer aus einer Textdatei (eine Textdatei je Version). Technisch ist es möglich, alle SQL-Befehle in einem Stück - getrennt durch Strichpunkt - verarbeiten zu lassen. Aber was Fehlermeldung und Wiederanlauf betrifft, ist das nicht der Hit.

Deshalb: 
- SQL-Statements in der Textdatei durch eine eindeutige Zeichenfolge trennen
- In einer Schleife alle SQL-Statements abarbeiten
- wenn die Datei nicht zu groß ist, einfach alles einlesen und string.split("Trennzeichenfolge")
- speziell für den Wiederanlauf, ist es von Vorteil bei einem Fehler weiterzumachen
(zu vermeiden: INSERT's ohne eindeutigen Schlüssel)
- zum Schluss die Configdatei mit der Versionsnummer anlagen/updaten

In der Verarbeitungsschleife läßt sich mit dem SQL-Statement + dem SQL-Returncode ganz leicht ein aussagekräftiges Update.log erzeugen.

Die Lösung mag war etwas übertrieben scheinen, die Klassen sollten sich aber problemlos für andere Projekte verwenden lassen. Die applikationsspezifische Angaben (File- und Feldnamen) stehen ja in den Textdateien.

/Robert


----------

