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

时间:2018-03-15 13:20:21

标签: indexing liquibase

查看liquibase文档http://www.liquibase.org/documentation/changes/create_index.html,使用create index时无法使用CIC,因为liquibase没有用于指定并发选项的标记。

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

3 个答案:

答案 0 :(得分:1)

您可以将WCHAR*指定为runInTransaction以同时创建索引。

答案 1 :(得分:0)

创建并发索引必须使用任意sql change

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

这是a_horse_with_no_name's commentTheDude's answer的组合。

答案 2 :(得分:0)

以前的答案就可以了。我想提供一种替代方案,它不能直接回答OP的问题,但是可以提供具有相同最终结果的解决方案,并具有一些额外的优势。对于像我一样迷失于此答案的人们,我觉得向他们展示其他选择是很好的。

为了仅使用Liquibase创建索引,您将需要使用<sql>标签。我警告不要这样做,因为如果出于任何原因(开发,评估,测试等)使用其他数据库,这可能会导致意外的后果。 sql语句将被跳过,您可能会以为实际上没有添加索引就可以了。

另外,如果您在生产系统上运行此迁移而不将其拆下来进行维护,并且迁移是构建过程的一部分,则这可能会导致迁移控制较少。

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

首先,手动添加索引:

CREATE INDEX CONCURRENTLY widgets_kind_idx ON widgets (kind);

然后将其添加到您的Liquibase changeSet中:

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

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