liquibase无法在分区表上创建索引和唯一约束

问题描述

Liquibase文件如下:

databaseChangeLog:

  - 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 Position或附近的语法错误:93 [失败的sql:(0)更改表public.account_balance添加唯一(balance_date,account_id)按范围分组(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)创建索引account_id_idx ON public.account_balance_p0(account_id)PARTITION BY RANGE(balance_date);创建表public.account_balance_p0 account_balance的分区,用于从('2020-10-01 00:00:00')到('2020-11-01 00:00:00');] \ tat liquibase.changelog.ChangeSet的值。 execute(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的方式是否有错误

我正在使用带有弹簧启动2.3.3的postgresql 11版本和liquibase

解决方法

modifySql的{​​{1}}类型也适用于ChangeSetaddUniqueConstraint类型。生成的sql的异常是由于在createIndexPARTITION BY RANGE创建过程中添加了Index

只需将其分为两部分-一个创建表的ChangeSet和一个创建UniqueConstraintIndex的ChangeSet:

UniqueConstraint

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