Postgres:如何使用 liquibase 同时创建索引

use*_*095 7 indexing liquibase

查看 liquibase 文档http://www.liquibase.org/documentation/changes/create_index.html,CIC 不能用于创建索引,因为 liquibase 没有用于指定并发选项的标签。

有没有办法与 liquibase 同时创建索引?

The*_*ude 8

您可以指定runInTransactionfalse同时创建索引。


sgh*_*ill 8

创建并发索引必须通过任意sql 更改来完成:

<changeSet runInTransaction="false" id="10-add-widgets-kind-index" author="username">
    <sql dbms="postgresql">
        CREATE INDEX CONCURRENTLY
        IF NOT EXISTS idx_widgets_kind 
        ON widgets(kind)
    </sql>
</changeSet>
Run Code Online (Sandbox Code Playgroud)

这是a_horse_with_no_name 的评论TheDude 的回答的组合。


coo*_*ode 7

前面的答案可以完成这项工作。我想提供一种替代方案,它不直接回答OP的问题,但确实提供了具有相同最终结果并具有一些附加优点的解决方案。我觉得向像我一样偶然发现这个答案的人展示其他选择是很好的。

为了仅使用 Liquibase 创建索引,您需要使用标签<sql>。我警告不要这样做,因为如果您出于任何原因(开发、评估、测试等)使用不同的数据库,它可能会导致不良后果。sql 语句将被跳过,您可能会认为索引已添加,但实际上并未添加。

此外,这可能会导致迁移受控程度较低,假设您在生产系统上运行它,而没有将其停机进行维护,并且迁移是构建过程的一部分。

我建议直接在 Postgres 上创建索引,并通常使用 Liquibase 和前置条件检查添加索引迁移。

首先,手动添加索引:

CREATE INDEX CONCURRENTLY widgets_kind_idx ON widgets (kind);
Run Code Online (Sandbox Code Playgroud)

然后添加到您的 Liquibase 变更集中:

<changeSet id="10-add-widgets-kind-index" author="username">

    <preConditions onFail="MARK_RAN">
        <not>
            <indexExists indexName="widgets_kind_idx" />
        </not>
    </preConditions>

    <createIndex tableName="widgets" indexName="widgets_kind_idx">
        <column name="kind" />
    </createIndex>

</changeSet>
Run Code Online (Sandbox Code Playgroud)

这提供了以任何所需方式添加索引的能力,并使您的 Liquibase 迁移保持在已知状态。正在设置的新数据库不需要关键字CONCURRENTLY