当前位置: 首页 > 知识库问答 >
问题:

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

宋丰
2023-03-14
<column name="LOWER(name)"/>
<column name="LCASE(name)"/>
<column name="LOWER(name)" computed="true"/>
<column name="LCASE(name)" computed="true"/>
<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:意外标记:(必需:)[失败的SQL:在public.users上创建唯一索引public.lower_case_index(LOWER(name))]

我理想的解决方案应该是这样的:

<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个答案

方季同
2023-03-14

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>
 类似资料:
  • 问题内容: 不知道在PostgreSQL 9.3+中是否可行,但是我想在非唯一列上创建唯一索引。对于像这样的表: 我想仅能[快速]查询不同的日子。我知道我可以用来帮助执行不同的搜索,但是如果不同值的数量大大少于索引覆盖的行数,这似乎会增加额外的开销。就我而言,大约30天中有1天与众不同。 我是创建关系表以仅跟踪唯一条目的唯一选择吗?思维: 并在每次插入数据时使用触发器来更新它。 问题答案: 索引只

  • Liquibase文件如下: 数据库更改日志: 我在启动spring boot应用程序时添加唯一约束时遇到以下错误 迁移更改集失败 /db/changelog/changes/1.create-account-balance-table.yml::1::roran:原因:liquibase.exception.数据库异常: ERROR:语法错误在或接近PARTITION位置: 93[失败SQL:(

  • CreateIndexes 根据struct中的tag来创建索引 CreateUniques 根据struct中的tag来创建唯一索引

  • 问题内容: SQLAlchemy支持在postgresql中创建部分索引。 是否可以通过SQLAlchemy创建部分 唯一 索引 ? 像这样想象一个表/模型: 我想要一个唯一的索引,对于给定的发票,该索引只能有一个“活动”的ScheduledPayment。 我可以在postgres中手动创建它: 我想知道如何使用SQLAlchemy 0.9将其添加到我的SQLAlchemy模型中。 问题答案:

  • 我是MongoDB的新手。在研究主题“在MongoDB中施加唯一约束”时,我遇到了将unique字段设置为true的createindex的概念。这确保了在其上创建索引的某个字段在整个DB中变得唯一。 我有一个学生集合,它有三个字段:student_id、name、age.我希望student_id在我的数据库中是唯一的。现在,对于字段'name'=“xyz”的值,我可以允许许多student_i

  • 我试图在我们的COSMOSDB上的一些集合上创建一个唯一的索引。每个MS文档https://docs.microsoft.com/en-us/azure/cosmos-db/mongoDB-indexing:只有当集合为空(不包含任何文档)时,才能创建唯一索引。 因此,我清理了集合上的所有数据,但遇到错误时,消息是: 你知道为什么我会出错吗? 谢谢,