14

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

CREATE INDEX idx_name ON my_table (m_column DESC)

对于 oracle、postgresql、mysql 和 sql server,我需要它。

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

4

4 回答 4

8

我提交了一个拉取请求,使其进入 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>
于 2015-04-15T00:41:10.403 回答
3

要利用 LiquibasecreateIndex并支持不同的 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 上测试)

但是,上面的内容和看起来一样丑陋。我想使用 simple<sql>会产生更易读的结果,老实说,它似乎并没有降低便携性。

于 2015-02-10T22:01:43.360 回答
3

我刚刚浏览了 liquibase 源代码,并没有发现任何对索引列排序的处理。所以我建议你使用sqlandmodifySql块(我相信大多数 DBMS 的语法相同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>
于 2012-11-04T08:59:15.960 回答
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>
于 2015-02-09T18:09:20.577 回答