【问题标题】:HSQL: Creating index if not existingHSQL:如果不存在则创建索引
【发布时间】: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


【解决方案1】:

最新版本的 HSQLDB 支持两者:

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

【讨论】:

  • 实际上,我的行为很奇怪。如果我使用create index if not exists ix_test1 on test_table (field1, field2),我最终会得到一个名为if 的索引并再次运行该命令,我会得到object name already exists。使用 HSQL 2.3.3。
  • 尝试 2.3.4,而不是 2.3.3。
猜你喜欢
  • 1970-01-01
  • 2021-05-02
  • 2023-02-06
  • 2013-11-16
  • 2017-10-15
  • 1970-01-01
  • 2016-10-24
  • 2012-02-04
  • 2013-05-26
相关资源
最近更新 更多