在 hsqldb / liquibase 中使用函数创建唯一索引

create unique index with function in 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 内置函数,但其​​中任何一个都不适合我。

每次我都遇到错误:

Reason: liquibase.exception.DatabaseException: unexpected token: ( required: ) [Failed SQL: CREATE UNIQUE INDEX PUBLIC.lower_case_index ON PUBLIC.users(LOWER(name))]

我知道一个解决方案,我可以将列类型从 VARCHAR 更改为 VARCHAR_IGNORECASE,但对我来说不是这种情况,因为我需要一个解决方案来同时处理数据库: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>

但是不行。

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

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

可能看起来像这样:

<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>