Создание индексов с нисходящими ключевыми столбцами с помощью 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>