2013-09-04 19 views
7

sto inizializzazione di una banca dati HSQL 2.2.9 tramite Spring utilizzaHSQL: creazione dell'indice se non esistenti

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

Nel creare-tables.sql utilizzare

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

Il tavolo ha anche una indice. Sto cercando un modo migliore di perdere sempre e creare l'indice.

ho provato:

CREATE INDEX IF NOT EXISTS myIndex ...; 
  • non funziona

posso creare una funzione indexExisting() controllando le tabelle di sistema e il ritorno count (*)> 0 se viene rilevato l'indice , ma se scrivo

IF indexExisting() = 0 THEN ... 

direttamente nel file .sql, si dice

java.sql.SQLSyntaxErrorException: unexcepted token: IF 

Anche una procedura memorizzata non sembra essere d'aiuto, in quanto potrebbero non contenere istruzioni DROP, per quanto ho letto.

Sarebbe gradita una soluzione diversa dall'abbandonare/creare l'indice.

Grazie

+0

preferirei correre tutte le dichiarazioni di migrazione dello schema utilizzando uno strumento come Liquibase o Flyway che tiene traccia di ciò che è stato applicato e cosa deve essere fatto –

+0

Grazie, controllerò questi strumenti. Lo script sql ha un altro difetto, generando un'eccezione quando si tenta di eliminare l'indice non ancora esistente. Per ora, l'ho modificato per inizializzare le tabelle e gli indici tramite la classe, in cui è possibile rilevare l'eccezione. – pma

+1

'drop index se esiste my_index' funzionerà nel modo previsto. Tuttavia, 'crea indice se non esiste my_index su my_table (my_column)' creerà un indice chiamato 'if'. Avrà le caratteristiche esatte che hai inteso, ad eccezione del nome e del fatto che è stato creato incondizionatamente e fallirà se eseguito due volte. Ancora alla ricerca di una soluzione da solo - il calo e la ricomposizione dell'indice ogni volta possono diventare piuttosto costosi su un DB di grandi dimensioni. – user149408

risposta

3

L'ultima versione di HSQLDB supporta entrambi:

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

Testato con V 2.3.4 tramite il gestore database swing. – pma

+1

In realtà, sto diventando strano comportamento. Se uso 'create index se non esiste ix_test1 su test_table (field1, field2)' Finisco con un indice chiamato 'if' e eseguendo di nuovo il comando ottengo' il nome dell'oggetto esiste già. Utilizzo di HSQL 2.3.3. –

+1

Prova 2.3.4, non 2.3.3. – fredt

Problemi correlati