我想知道是否有一种通用的方法可以用 liquibase 创建一个“有序索引”。会产生这种 SQL 语句的东西:
CREATE INDEX idx_name ON my_table (m_column DESC)
对于 oracle、postgresql、mysql 和 sql server,我需要它。
如果没有,我将不得不使用SQL
每个 RDBM 的标签手动完成。
我想知道是否有一种通用的方法可以用 liquibase 创建一个“有序索引”。会产生这种 SQL 语句的东西:
CREATE INDEX idx_name ON my_table (m_column DESC)
对于 oracle、postgresql、mysql 和 sql server,我需要它。
如果没有,我将不得不使用SQL
每个 RDBM 的标签手动完成。
我提交了一个拉取请求,使其进入 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>
要利用 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>
会产生更易读的结果,老实说,它似乎并没有降低便携性。
我刚刚浏览了 liquibase 源代码,并没有发现任何对索引列排序的处理。所以我建议你使用sql
andmodifySql
块(我相信大多数 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>
在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>