使用Liquibase创建具有降序键列的索引

时间:2012-08-14 15:06:26

标签: indexing rdbms liquibase database-agnostic

我想知道是否存在使用liquibase创建“有序索引”的通用方法。会产生这种SQL语句的东西:

CREATE INDEX idx_name ON my_table (m_column DESC)

我需要oracle,postgresql,mysql和sql server。

如果没有,我将不得不手动使用每个RDBM的SQL标记。

4 个答案:

答案 0 :(得分:6)

我提交了一个pull request,使其成为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或更高版本的软件包here

使用此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>

答案 1 :(得分:2)

我刚刚浏览了liquibase源代码,但没有找到任何索引列排序的处理方法。所以我建议你使用sqlmodifySql块(我相信大多数DBMS都有create index的相同语法,所以你可能不需要modifySql):< / p>

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

答案 2 :(得分:1)

https://liquibase.jira.com/browse/CORE-419处的liquibase索引排序仍有未解决的功能请求。

一种可能的解决方法(自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>

请注意,在liquibase 3.2验证硬化之前,甚至可以使用更短的解决方法:

<createIndex tableName="my_table" indexName="my_index">
    <column name="registration_time DESC"/>
    <column name="id ASC"/>
</createIndex>

答案 3 :(得分:1)

要利用Liquibase createIndex并支持不同的RDBMS,您需要使用modifySql(直到https://liquibase.jira.com/browse/CORE-419被修复,正如@Vadzim所指出的那样。

对于Oracle和PostgreSQL,语法很简单(除非在#34中使用PostgreSQL;总是引用列名&#34;模式):

<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>会产生更可读的结果,老实说,它似乎不那么便携。