我想知道是否存在使用liquibase创建“有序索引”的通用方法。会产生这种SQL语句的东西:
CREATE INDEX idx_name ON my_table (m_column DESC)
我需要oracle,postgresql,mysql和sql server。
如果没有,我将不得不手动使用每个RDBM的SQL
标记。
答案 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源代码,但没有找到任何索引列排序的处理方法。所以我建议你使用sql
和modifySql
块(我相信大多数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>
会产生更可读的结果,老实说,它似乎不那么便携。