use*_*095 7 indexing liquibase
查看 liquibase 文档http://www.liquibase.org/documentation/changes/create_index.html,CIC 不能用于创建索引,因为 liquibase 没有用于指定并发选项的标签。
有没有办法与 liquibase 同时创建索引?
创建并发索引必须通过任意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 的回答的组合。
前面的答案可以完成这项工作。我想提供一种替代方案,它不直接回答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。
| 归档时间: |
|
| 查看次数: |
3746 次 |
| 最近记录: |