【问题标题】:Liquibase createIndex column orderLiquibase createIndex 列顺序
【发布时间】:2017-04-02 06:47:55
【问题描述】:

我正在尝试将 Liquibase 用于我们的项目。我们主要使用Oracle数据库和其他一些数据库,使用频率较低。我试图弄清楚如何在索引的情况下指定列顺序。下面是一个典型的创建索引更改集。

<createIndex indexName="PK_xxxxxxx" tableName="xxxxx" unique="true">
   <column name="column_1"/>
   <column name="column_2"/>
   <column name="column_3"/>
</createIndex>

在性能和应用程序可扩展性方面,索引中的列顺序非常重要。如果在创建索引时可以指定相同的方法,您能否指导我?

PS:根据列标签文档,属性afterColumnposition 存在,它们仅适用于我假设的创建表。以下是相关文档的说明。

如果在“addColumn”命令中使用,此属性允许您控制新列在表列顺序中的位置。只允许使用 beforeColumn、afterColumn 或 position 之一。从 3.1 开始

【问题讨论】:

  • 您引用的文档是指“addColumn”命令。您正在使用 createIndex 命令。
  • @PeterHenell 是的,在创建表期间,允许使用“AfterColumn”或“Position”属性进行列顺序。我想知道是否同样可以与“CreateIndex”一起使用。
  • @a_horse_with_no_name,谢谢。通常 XML 是“无序”的,这意味着如果我在生成这些 XML 文件时使用其他标准工具进行 XML 操作,则无法保证列将保持有序。这就是提出这个问题的原因。

标签: liquibase


【解决方案1】:

Liquibase 将使用 createIndex 标记中列出的列顺序 - 非常类似于 DBMS 使用 create index 语句中指定的顺序。

以下变更集:

<changeSet author="arthur" id="1">
  <createTable tableName="foo">
    <column name="col_1" type="integer"/>
    <column name="col_2" type="integer"/>
    <column name="col_3" type="integer"/>
  </createTable>
  <createIndex indexName="ix_one" tableName="foo">
    <column name="col_1"/>
    <column name="col_2"/>
    <column name="col_3"/>
  </createIndex>
  <createIndex indexName="ix_two" tableName="foo">
    <column name="col_3"/>
    <column name="col_2"/>
    <column name="col_1"/>
  </createIndex>
  <createIndex indexName="ix_three" tableName="foo">
    <column name="col_2"/>
    <column name="col_3"/>
    <column name="col_1"/>
  </createIndex>
</changeSet>

将产生以下语句(例如使用updateSQL 运行时):

CREATE TABLE public.foo (col_1 INT, col_2 INT, col_3 INT);

CREATE INDEX ix_one ON public.foo(col_1, col_2, col_3);

CREATE INDEX ix_two ON public.foo(col_3, col_2, col_1);

CREATE INDEX ix_three ON public.foo(col_2, col_3, col_1);

【讨论】:

  • 嗨,我之前测试过。虽然 liquibase 尊重元素的顺序,但其他 XML 处理工具却不这样做。例如,我使用 python 生成 XML,这些 XML 将作为 liquibase 的输入。标准的 python XML 操作库不遵循“STRICT”解析,而是尝试按字母顺序对标签进行排序。这对我来说是个问题。可能在未来的版本中,创建索引的位置也会有属性,应该可以解决这个问题。再次感谢您的帮助和澄清。
  • 那么,您正在使用的那些“其他 XML 处理工具”有问题。 XML 中元素的顺序是相关的。您甚至可以在 XML 模式 (XSD) 中定义 required 顺序 - 如果这与 XML 无关 是不可能的
  • 部分正确。仅当 XSD 这么说时,XML 中的顺序才重要。如果不是,对于普通的 XML,顺序无关紧要。这是此类讨论的链接。 does-xml-care-about-the-order-of-elements
  • 那个链接是关于无效订单的。如果您的某些标签顺序错误,导致无效文档无效.. 在验证器中。 xhtml 或 liquibase 文件中的顺序无关紧要。在 python 函数中,语句的顺序无关紧要。您可以对它们进行排序并制作完全有效的文档(只要您不对具有有效顺序的表格标签的内容进行排序)。当您这样做时,尽管您更改了这些文档的语义。验证器不验证语义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-07
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多