Создание индексов с нисходящими ключевыми столбцами с помощью Liquibase

Мне интересно, существует ли общий способ создания "упорядоченного индекса" с использованием жидкой базы. Что-то, что будет производить такого рода оператор SQL:

CREATE INDEX idx_name ON my_table (m_column DESC)

Мне это нужно для сервера Oracle, Postgresql, MySQL и SQL.

Если нет, мне придется сделать это вручную с SQL тег для каждой RDBM.

4 ответа

Я отправил запрос на извлечение, который превратил его в Liquibase 3.4.0, который позволял задавать столбцы с нисходящим ключом не только для индексов, но также для первичных ключей и уникальных ограничений. Это работает даже в базах данных с именами столбцов в кавычках, таких как Microsoft SQL Server.

Пример того, как это работает

<createIndex tableName="my_table" indexName="my_index">
    <column name="col1"/>
    <column name="col2" descending="true"/>
</createIndex>

<addPrimaryKey tableName="my_table" columnNames="col1, col2 DESC"/>

<addUniqueConstraint tableName="my_table" columnNames="col1, col2 DESC"/>

Попробуйте это

Загрузите пакет 3.4.1 или новее здесь.

ИЛИ ЖЕ

Используйте эту зависимость Maven

<dependency>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-core</artifactId>
    <version>3.4.1</version>
</dependency>

А ТАКЖЕ

Обязательно обновите ссылочный XSD до 3.4

<?xml version="1.0" ?>
<databaseChangeLog
    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
    xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.4.xsd
        http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">

...

</databaseChangeLog>

Я только что просмотрел исходный код liquibase и не нашел обработки порядка столбцов для индексов. Поэтому я бы порекомендовал вам использовать sql а также modifySql блоки (я считаю, что большинство СУБД имеют одинаковый синтаксис для create index так что, вероятно, вам не нужно modifySql):

<changeSet id="1">
    <sql>
<![CDATA[
CREATE INDEX idx_name ON my_table (m_column DESC)
]]>
    </sql>
    <!-- just for example -->
    <modifySql dbms="mssql">
        <replace replace="CREATE INDEX" with="CREATE NONCLUSTERED INDEX"/>
    </modifySql>
</changeSet>

Чтобы использовать Liquibase createIndex и поддерживать разные RDBMS, вам нужно будет использовать modifySql (пока не будет исправлено https://liquibase.jira.com/browse/CORE-419, как указано @Vadzim.

Для Oracle и PostgreSQL синтаксис будет простым (если только PostgreSQL не используется в режиме "всегда указывать имена столбцов"):

<modifySql>
    <replace replace="COL1NAME" with="COL1NAME ASC"/>
    <replace replace="COL2NAME" with="COL2NAME DESC"/>
</modifySql>

Однако это не будет работать на SQL Server. Liquibase переносит имена столбцов в [...] на SQL Server, так что вам нужно что-то вроде

<modifySql>
    <regExpReplace replace="\bCOL1NAME\b[^,) ]*" with="$0 ASC" />
    <regExpReplace replace="\bCOL2NAME\b[^,) ]*" with="$0 DESC" />
</modifySql>

(проверено на oracle, postgresql, sql server и h2)

Однако вышесказанное выглядит так же безобразно, как выглядит. Я полагаю, используя простой <sql> дает более читаемые результаты, и, честно говоря, он не выглядит менее портативным.

На сайте https://liquibase.jira.com/browse/CORE-419 все еще не решен запрос на добавление индекса ликвидабазы.

Один возможный обходной путь (с версии 1.9):

<createIndex tableName="my_table" indexName="my_index">
    <column name="COL1NAME"/>
    <column name="COL2NAME"/>
</createIndex>
<modifySql>
    <replace replace="COL1NAME" with="COL1NAME ASC"/>
    <replace replace="COL2NAME" with="COL2NAME DESC"/>
</modifySql>

Обратите внимание, что существовал еще более короткий обходной путь до тех пор, пока проверка не затвердела в жидкой основе 3.2:

<createIndex tableName="my_table" indexName="my_index">
    <column name="registration_time DESC"/>
    <column name="id ASC"/>
</createIndex>
Другие вопросы по тегам