2013-09-04 2 views
7

Я инициализации базы данных HSQL 2.2.9 с помощью Spring, используяHSQL: Создание индекса, если не существует

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

Создать-tables.sql Я использую

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

В таблице также имеет индекс. Я ищу лучший способ, чем всегда отбрасывать и создавать индекс.

Я пробовал:

CREATE INDEX IF NOT EXISTS myIndex ...; 
  • не работает

я могу создать функцию indexExisting() проверка системных таблиц и возврата COUNT (*)> 0, если индекс найден , но если я напишу

IF indexExisting() = 0 THEN ... 

непосредственно в файл .sql, он говорит

java.sql.SQLSyntaxErrorException: unexcepted token: IF 

Также хранимая процедура, похоже, не помогает, поскольку они не могут содержать инструкции DROP, насколько я читаю.

Таким образом, было бы полезно принять решение, отличное от снижения/создания индекса.

Спасибо

+0

Я предпочел бы работать все операторы миграции схемы с использованием такого инструмента, как LiquiBase или Flyway, который отслеживает то, что было применено и Что должно быть сделано. –

+0

Спасибо, я проверю эти инструменты. В sql-скрипте есть еще один недостаток, создающий исключение при попытке сбросить еще не существующий индекс. На данный момент я изменил его, чтобы инициализировать таблицы и индексы через класс, где исключение можно уловить. – pma

+1

'drop index if exists my_index' будет работать ожидаемым образом. Тем не менее, 'create index if not exists my_index on my_table (my_column)' создаст индекс с именем 'if'. Он будет иметь точные характеристики, которые вы намеревались, за исключением имени и того факта, что он создан безоговорочно и сработает, если выполняется дважды. И все-таки искать решение самостоятельно - падение и воссоздание индекса каждый раз может стать довольно дорогостоящим на большой БД. – user149408

ответ

3

Последняя версия HSQLDB поддерживает:

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

Протестировал его с помощью V 2.3.4 через диспетчер базы данных swing – pma

+1

На самом деле, я получаю странное поведение. Если я использую 'create index, если не существует ix_test1 на test_table (field1, field2)' Я заканчиваю индексом с именем 'if' и снова запускаю команду. Я получаю' имя объекта уже существует'. Использование HSQL 2.3.3. –

+1

Попробуйте 2.3.4, а не 2.3.3. – fredt

Смежные вопросы