2017-12-13 27 views
0

hsqldbで関数インデックスを使用する方法はありますか?私はHSQLDBを得たことに気づいたドキュメントでhsqldb/liquibaseの関数でユニークなインデックスを作成する

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

:私のCREATEINDEXのチェンジ内部

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

は、私はそれらの4を試してみましたLOWERと機能に建てLCASEが、それらのいずれかが動作しません。私のために。

私はエラーを持っているひとつひとつの時間:

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

私はVARCHAR_IGNORECASEにVARCHARから列タイプを変更することができます解決策を知っているが、私は解決策を必要とするので、それは、私の場合ではないのです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

HSQLDBは​​関数ベースのインデックスをまったくサポートしていないため、別の解決策を見つける必要があります。たとえば、 varcharの代わりに列をvarchar_ignorecaseと定義し、その列に「通常の」ユニークなインデックスを作成します。

プロパティを使用して1つのテーブル定義を保持できます。

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

チェックこの1:https://liquibase.jira.com/browse/CORE-2179と別の1:https://liquibase.jira.com/browseこのようになります。

/CORE-2107。関数ベースのインデックスを作成するサポートはないと確信していますか? – degath

+0

@degath:ああ、感謝していませんでした。しかし、それはHSQLDBのアプローチを変更しません –

+0

私はpostgresについての私の例のようにそれを行うことができるように見えるが、hsqldbのためのvarchar ignorecaseでそれを行う必要がまだありますか? – degath

関連する問題