Я инициализации базы данных 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, насколько я читаю.
Таким образом, было бы полезно принять решение, отличное от снижения/создания индекса.
Спасибо
Я предпочел бы работать все операторы миграции схемы с использованием такого инструмента, как LiquiBase или Flyway, который отслеживает то, что было применено и Что должно быть сделано. –
Спасибо, я проверю эти инструменты. В sql-скрипте есть еще один недостаток, создающий исключение при попытке сбросить еще не существующий индекс. На данный момент я изменил его, чтобы инициализировать таблицы и индексы через класс, где исключение можно уловить. – pma
'drop index if exists my_index' будет работать ожидаемым образом. Тем не менее, 'create index if not exists my_index on my_table (my_column)' создаст индекс с именем 'if'. Он будет иметь точные характеристики, которые вы намеревались, за исключением имени и того факта, что он создан безоговорочно и сработает, если выполняется дважды. И все-таки искать решение самостоятельно - падение и воссоздание индекса каждый раз может стать довольно дорогостоящим на большой БД. – user149408