2013-09-04 6 views
7

bestehende ich eine HSQL Datenbank 2.2.9 über Frühling bin Initialisierung mitHSQL: Index erstellen, wenn nicht

<jdbc:initialize-database enabled="true"> 
    <jdbc:script execution="INIT" location="classpath:./create-tables.sql" /> 
</jdbc:initialize-database> 

In create-tables.sql Ich benutze

CREATE TABLE IF NOT EXISTS MyTable(...); 

Die Tabelle ein auch hat Index. Ich suche nach einem besseren Weg, als immer den Index fallen zu lassen und zu erstellen.

Ich habe versucht:

CREATE INDEX IF NOT EXISTS myIndex ...; 
  • nicht

ich eine Funktion indexExisting erstellen funktioniert() überprüft die Systemtabellen und Rückkehr count (*)> 0, wenn der Index gefunden wird , aber wenn ich schreibe

IF indexExisting() = 0 THEN ... 

direkt in die .SQL-Datei, heißt es

Auch eine gespeicherte Prozedur scheint nicht zu helfen, da sie DROP-Anweisungen möglicherweise nicht enthalten, so weit ich gelesen habe.

Also eine andere Lösung als das Fallenlassen/Erstellen des Index würde geschätzt werden.

Danke

+0

Ich würde eher laufen alle Schema Aussagen Migration ein Tool wie Liquibase oder Flyway verwendet, die Spur hält, was angewendet wurde und Was getan werden muss. –

+0

Danke, ich werde diese Tools überprüfen. Das sql-Skript hat einen weiteren Fehler und löst eine Ausnahme aus, wenn versucht wird, den noch nicht vorhandenen Index zu löschen. Vorläufig habe ich es geändert, um die Tabellen und Indizes über die Klasse zu initialisieren, wo die Ausnahme abgefangen werden kann. – pma

+1

'Drop-Index, wenn vorhanden my_index' funktioniert in der erwarteten Weise. 'Create index if not exists my_index on my_table (my_column)' erstellt einen Index mit dem Namen 'if'. Es wird die genauen Merkmale haben, die Sie beabsichtigt haben, außer dem Namen und der Tatsache, dass es bedingungslos erstellt wurde und bei zweimaliger Ausführung fehlschlägt. Immer noch auf der Suche nach einer Lösung - das Löschen und erneute Erstellen des Index jedes Mal kann in einer großen Datenbank ziemlich teuer werden. – user149408

Antwort

3

Die neueste Version von HSQLDB unterstützt beide:

CREATE INDEX IF NOT EXISTS myIndex ... 
DROP INDEX IF EXISTS myIndex 
+0

Getestet mit V 2.3.4 über den Swing-Datenbankmanager – pma

+1

Eigentlich bekomme ich merkwürdiges Verhalten. Wenn ich 'create index if not exists ix_test1 on test_table (field1, field2)' benutze Ich habe einen Index mit dem Namen 'if' und wenn ich den Befehl erneut ausführen bekomme ich 'object name exists exists'. Verwenden von HSQL 2.3.3. –

+1

Versuchen Sie 2.3.4, nicht 2.3.3. – fredt