Liquibase 3.5创建降序索引时descending属性不允许报错如何解决
问题原因
- 报错
attribute 'descending' is not allowed to appear in element 'column'是因为descending属性是Liquibase 3.6及更高版本才为<column>标签新增的特性,你使用的3.5版本的XML校验规则不支持该属性,因此触发报错。 - 后续触发
column does not exist报错,是因为你将DESC写入name属性后,Liquibase会将JoiningDate DESC整体识别为列名去匹配表结构,无法匹配到实际存在的JoiningDate列。
解决方案
Liquibase 3.5版本可以通过以下两种方式实现降序索引的创建:
方案1:使用<sql>标签执行原生SQL(兼容性最优)
直接编写对应数据库的原生建索引语句,绕过Liquibase的XML标签校验,示例如下:
<sql> CREATE UNIQUE INDEX EMPIDX ON Employee(JoiningDate DESC, Empnumber); </sql>
你可以根据实际使用的数据库类型调整上述SQL的语法即可。
方案2:结合<createIndex>与<modifySql>动态修改生成的SQL
如果需要保留Liquibase自动适配多数据库语法的特性,可以先编写标准的<createIndex>逻辑,再通过<modifySql>的替换能力为指定列拼接降序标识,示例如下:
<createIndex unique="true" indexName="EMPIDX" tableName="Employee"> <column name="JoiningDate" /> <column name="Empnumber" /> <modifySql> <replace replace="JoiningDate" with="JoiningDate DESC"/> </modifySql> </createIndex>
后续如果升级到Liquibase 3.6及以上版本,你最开始使用descending属性的写法就可以直接正常运行。
内容的提问来源于stack exchange,提问作者Hitesh Mehta
相关产品推荐
相关产品推荐

