在hsqldb / liquibase中创建具有函数的唯一索引

时间:2017-12-13 13:46:07

标签: postgresql hsqldb liquibase

有没有办法在hsqldb中使用函数索引?

我尝试了那些4:

<column name="LOWER(name)"/>
<column name="LCASE(name)"/>
<column name="LOWER(name)" computed="true"/>
<column name="LCASE(name)" computed="true"/>

在我的createIndex变更集中:

<changeSet author="dgt" id="unique-postgres" dbms="hsqldb">
    <createIndex indexName="lower_case_index" tableName="users" unique="true">
        <column name="LOWER(name)" computed="true"/>
    </createIndex>

在文档中我注意到hsqldb得到了:LOWER和LCASE内置函数,但其​​中任何一个对我都不起作用。

每次我都有错误:

  

原因:liquibase.exception.DatabaseException:意外令牌:(   required:)[失败的SQL:CREATE UNIQUE INDEX PUBLIC.lower_case_index   ON PUBLIC.users(LOWER(name))]

我知道一个解决方案,我可以将列类型从VARCHAR更改为VARCHAR_IGNORECASE,但对我来说并非如此,因为我需要一个解决方案来处理db:hsqldb和postgres。

我理想的解决方案应如下所示:

<changeSet author="dgt" id="users-unique-index-postgres" dbms="hsqldb">
    <createIndex indexName="name_index" tableName="users" unique="true">
        <column name="LOWER(name)" computed="true"/>
    </createIndex>
</changeSet>
<changeSet author="dgt" id="users-unique-index-hsqldb" dbms="postgresql">
    <createIndex indexName="name_index" tableName="users" unique="true">
        <column name="lower(name)" computed="true"/>
    </createIndex>
</changeSet>

但它不起作用。

1 个答案:

答案 0 :(得分:1)

HSQLDB根本不支持基于函数的索引,因此您需要找到不同的解决方案。你可以,例如将列定义为varchar_ignorecase而不是varchar,然后在该列上创建“普通”唯一索引。

您可以使用属性保留单个表定义。

这可能是这样的:

<changeSet author="dgt" id="create-users-table">
  <property name="users_name_type" value="varchar" dbms="postgresql"/>
  <property name="users_name_type" value="varchar_ignorecase" dbms="hsqldb"/>

  <createTable tableName="users">
    <column name="name" type="${users_name_type}">
      <constraints nullable="false"/>
    </column>
  </createTable>
</changeSet>


<changeSet author="dgt" id="users-unique-index-postgres" dbms="postgresql">
  <createIndex indexName="name_index" tableName="users" unique="true">
    <column name="lower(name)" computed="true"/>
  </createIndex>
</changeSet>

<changeSet author="dgt" id="users-unique-index-hsqldb" dbms="hsqldb">
  <createIndex indexName="name_index" tableName="users" unique="true">
    <column name="name"/>
  </createIndex>
</changeSet>