В ответ на этот вопрос: Ограничение таблицы Postgres с использованием group-by , Я пытаюсь перевести следующий код Postgres в Liquibase XML

create unique index idx_table on table(subcategory, base_unit)
where base_unit;

Я пробовал это:

<createIndex indexName="idx_table"
    tableName="table"
    unique="true">
    <columnNames="subcategory, base_unit"/>
    <where>base_unit</where>
</createIndex>

Но это дает мне ошибку: за типом элемента «columnNames» должны следовать спецификации атрибутов, «>» или «/>».

ОБНОВЛЕНИЕ:

<createIndex indexName="idx_table"
    tableName="table"
    unique="true">
    <column name="subcategory"/>
    <column name="base_unit"/>
    <where>base_unit</where>
</createIndex>

Приводит к ошибке:

Invalid content was found starting with element 'where'. One of '{"liquibase.org/xml/ns/dbchangelog":column}' is expected.
1
user3591836 16 Дек 2014 в 00:47

2 ответа

Лучший ответ

Liquibase в настоящее время не поддерживает часть «где» в createIndex.

Вам нужно будет либо использовать modifySql:

<changeSet id="YOUR_ID" author="YOU">
    <createIndex indexName="idx_table"
                 tableName="table"
                 unique="true">
        <column name="subcategory"/>
        <column name="base_unit"/>
    </createIndex>
    <modifySql>
        <append value=" where base_unit"/>
    </modifySql>
</changeSet>

Или просто используйте sql напрямую:

<changeSet id="YOUR_ID" author="YOU">
    <sql>create unique index idx_table on table(subcategory, base_unit) where base_unit</sql>
</changeSet>
1
Nathan Voxland 19 Дек 2014 в 00:02

Я думаю, ваш xml должен выглядеть так:

<createIndex indexName="idx_table"
    tableName="table"
    unique="true">
    <column name="subcategory"/>
    <column name="base_unit"/>
    <where>base_unit</where>
</createIndex>
-1
SteveDonie 16 Дек 2014 в 16:16