有没有办法在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>
但它不起作用。
答案 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>