【问题标题】:liquibase unable to create index and unique constraint on partitioned tableliquibase 无法在分区表上创建索引和唯一约束
【发布时间】:2021-01-22 10:54:02
【问题描述】:

Liquibase 文件如下:

数据库变更日志:

  - changeSet:
      id: 1
      author: roran
      changes:
        - createTable:
            tableName: account_balance
            columns:
              - column:
                  name: id
                  type: bigint
                  autoIncrement: true
                  constraints:
                    primaryKey: true
              - column:
                  name: account_id
                  type: bigint
                  constraints:
                    nullable: false
              - column:
                  name: balance_date
                  type: date
                  constraints:
                    primaryKey: true
              - column:
                  name: create_date
                  type: timestamptz
              - column:
                  name: created_by
                  type: varchar(100)
              - column:
                  name: update_date
                  type: timestamptz
              - column:
                  name: updated_by
                  type: varchar(100)
        - modifySql:
            applyToRollback: false
            dbms: postgresql
            append:
              value: PARTITION BY RANGE (balance_date);
        - addUniqueConstraint:
            columnNames:  balance_date, account_id
            tableName:  account_balance
        - createIndex:
            columns:
              - column:
                  name:  account_id
            indexName:  account_id_idx
            tableName:  account_balance

在启动 Spring Boot 应用程序时添加唯一约束时出现以下错误

更改集 /db/changelog/changes/1.create-account-balance-table.yml::1::roran 迁移失败:原因:liquibase.exception.DatabaseException:错误:在 PARTITION 位置或附近出现语法错误: 93 [失败的 SQL: (0) ALTER TABLE public.account_balance ADD UNIQUE (balance_date, account_id)PARTITION BY RANGE (balance_date);]\tat org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1794 )\tat org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594)\tat org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:516)\

同样,我在启动 Spring Boot 应用程序时添加索引时遇到错误。

liquibase.exception.MigrationFailedException:更改集 db/changelog/changes/1.create-account-balance-table.yml::1::roran 迁移失败:原因:liquibase.exception.DatabaseException:错误:语法错误在 PARTITION 位置处或附近:[失败的 SQL:(0) CREATE INDEX account_id_idx ON public.account_balance_p0(account_id)PARTITION BY RANGE (balance_date); CREATE TABLE public.account_balance_p0 PARTITION OF account_balance FOR VALUES FROM ('2020-10-01 00:00:00') TO ('2020-11-01 00:00:00');]\tat liquibase.changelog.ChangeSet。执行(ChangeSet.java:646)\tat liquibase.changelog.visitor.UpdateVisitor.visit(UpdateVisitor.java:53)\tat liquibase.changelog.ChangeLogIterator.run(ChangeLogIterator.java:83)\tat liquibase.Liquibase.update( Liquibase.java:202)\tat

同样工作正常,如果我通过 liquibase 创建表,然后以编程方式创建索引或添加约束,如下所示

CREATE INDEX account_id_idx ON public.account_balance(account_id);

我在 liquibase 中使用 yaml 进行分区表的方式有什么错误吗?

我正在使用 postgresql 11 版本和带有 spring boot 2.3.3.RELEASE 的 liquibase

【问题讨论】:

    标签: postgresql docker liquibase


    【解决方案1】:

    ChangeSetmodifySql 类型也适用于 addUniqueConstraintcreateIndex 类型。由于IndexUniqueConstraint创建时添加了PARTITION BY RANGE,导致生成sql异常。

    只需将其分成两部分 - 一个用于创建表的 ChangeSet 和一个用于创建 IndexUniqueConstraint 的 ChangeSet:

      - changeSet:
          id: 1
          author: roran
          changes:
            - createTable:
                tableName: account_balance
                columns:
                  ...
            - modifySql:
                applyToRollback: false
                dbms: postgresql
                append:
                  value: PARTITION BY RANGE (balance_date);
    

      - changeSet:
          id: 2
          author: roran
          changes:
            - addUniqueConstraint:
                columnNames:  balance_date, account_id
                tableName:  account_balance
            - createIndex:
                columns:
                  column:
                    name:  account_id
                indexName:  account_id_idx
                tableName:  account_balance
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-15
      • 2021-11-02
      • 1970-01-01
      • 1970-01-01
      • 2011-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多