在 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>
有没有办法在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>