【发布时间】:2013-09-08 04:26:02
【问题描述】:
我正在使用 Spring 通过 Spring 初始化 HSQL 数据库 2.2.9
<jdbc:initialize-database enabled="true">
<jdbc:script execution="INIT" location="classpath:./create-tables.sql"/>
</jdbc:initialize-database>
在create-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 脚本还有另一个缺陷,在尝试删除尚不存在的索引时抛出异常。现在,我将其更改为通过类初始化表和索引,以便捕获异常。
-
drop index if exists my_index将以预期的方式工作。但是,create index if not exists my_index on my_table(my_column)将创建一个名为if的索引。它将具有您想要的确切特征,除了名称和它是无条件创建并且如果执行两次将失败的事实。我自己仍在寻找解决方案 - 每次删除并重新创建索引在大型数据库上会变得非常昂贵。
标签: hsqldb