当前位置: 首页 > 知识库问答 >
问题:

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

唐俊爽
2023-03-14

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.数据库异常: ERROR:语法错误在或接近PARTITION位置: 93[失败SQL:(0)ALTER TABLEpublic.account_balanceADD UniQUE(balance_date,account_id)PARTITION BY RANGE(balance_date);]\tatorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1794)\tatorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594)\tatorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:516)\

同样,我在启动Spring启动应用程序时添加索引时出错。

液化。例外MigrationFailedException:更改集db/changelog/changes/1的迁移失败。创建账户余额表。罗兰:原因:液化。例外数据库异常:错误:分区位置处或附近的语法错误:[失败的SQL:(0)在public上创建索引account\u id\u idx。account\u balance\u p0(account\u id)按范围(balance\u date)分区;创建表public.account\u balance\u p0 account\u balance的分区,用于从('2020-10-01 00:00')到('2020-11-01 00:00');]\tat液化酶。变更日志。变更集。在liquibase中执行(ChangeSet.java:646)。变更日志。来访者UpdateVisitor。访问(UpdateVisitor.java:53)\t liquibase。变更日志。变更计算器。在liquibase中运行(ChangeLogIterator.java:83)。液化。更新(Liquibase.java:202)\t

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

CREATE INDEX account_id_idx ON public.account_balance(account_id);

我在liquibase中为分区表使用yaml的方式是否有任何错误?

我正在使用postgresql 11版本和liquibase with spring boot 2.3.3。释放

共有1个答案

潘意
2023-03-14

您的ChangeSet修改Sql类型也应用于您的addUniqueConstraintcreateIndex类型。生成的sql的异常是由于将PARTITION BY RANGE添加到IndexUniqueConstraint创建中。

只需将其分为两部分-一个变更集与表创建,一个变更集与索引和唯一约束创建:

  - 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
 类似资料:
  • CreateIndexes 根据struct中的tag来创建索引 CreateUniques 根据struct中的tag来创建唯一索引

  • 问题内容: 不知道在PostgreSQL 9.3+中是否可行,但是我想在非唯一列上创建唯一索引。对于像这样的表: 我想仅能[快速]查询不同的日子。我知道我可以用来帮助执行不同的搜索,但是如果不同值的数量大大少于索引覆盖的行数,这似乎会增加额外的开销。就我而言,大约30天中有1天与众不同。 我是创建关系表以仅跟踪唯一条目的唯一选择吗?思维: 并在每次插入数据时使用触发器来更新它。 问题答案: 索引只

  • 我正在创建一个简单的实体,并试图将它持久化到Oracle数据库中。这是我的天赋: 这是我的Java类,它创建了这个实体的一个实例,并使用HiberNate将其保存到数据库中: 当我运行这个程序时,我得到一个异常: 请帮助我在此代码中犯错误的地方。我正在使用 更新:这是我的Hibernate配置文件,表由Hibernate本身生成: 另外,如果可能的话,请给我推荐一个Hibernate-4.3的好资

  • 在文档中,我注意到hsqldb得到了:LOWER和LCASE内置函数,但这些函数对我都不起作用。 每次我都犯错误: 原因:LiquiBase.Exception.DatabaseException:意外标记:(必需:)[失败的SQL:在public.users上创建唯一索引public.lower_case_index(LOWER(name))] 我理想的解决方案应该是这样的: 但不管用。

  • 问题内容: SQLAlchemy支持在postgresql中创建部分索引。 是否可以通过SQLAlchemy创建部分 唯一 索引 ? 像这样想象一个表/模型: 我想要一个唯一的索引,对于给定的发票,该索引只能有一个“活动”的ScheduledPayment。 我可以在postgres中手动创建它: 我想知道如何使用SQLAlchemy 0.9将其添加到我的SQLAlchemy模型中。 问题答案:

  • 我有一个使用Hibernate访问数据库的应用程序。它会抛出如下错误: 组织Spring框架清洁工厂。BeanCreationException:创建URL[文件:/C:/Program Files(x86)/XXX/applicationContext.xml]中定义的名为“sessionFactory”的bean时出错:初始化方法调用失败;嵌套异常是org.hibernate。Annotati