liquibase 无法在分区 table 上创建索引和唯一约束
liquibase unable to create index and unique constraint on partitioned table
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 引导应用程序时添加唯一约束时遇到以下错误
Migration failed for change set /db/changelog/changes/1.create-account-balance-table.yml::1::roran: Reason: liquibase.exception.DatabaseException: ERROR: syntax error at or near PARTITION Position: 93 [Failed 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 引导应用程序时添加索引时遇到错误。
liquibase.exception.MigrationFailedException: Migration failed for change set db/changelog/changes/1.create-account-balance-table.yml::1::roran: Reason: liquibase.exception.DatabaseException: ERROR: syntax error at or near PARTITION Position: [Failed 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.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 创建 table,然后通过编程方式创建索引或添加约束,如下所示
CREATE INDEX account_id_idx ON public.account_balance(account_id);
我在 liquibase 中为分区 table 使用 yaml 的方式有什么错误吗?
我正在使用 postgresql 11 版本和 liquibase spring boot 2.3.3.RELEASE
您的 ChangeSet
的 modifySql
类型也适用于您的 addUniqueConstraint
和 createIndex
类型。由于在 Index
和 UniqueConstraint
创建中添加了 PARTITION BY RANGE
,因此生成的 sql 出现异常。
只需将它分成两部分 - 一个包含 table 创建的 ChangeSet 和一个包含 Index
和 UniqueConstraint
创建的 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
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 引导应用程序时添加唯一约束时遇到以下错误
Migration failed for change set /db/changelog/changes/1.create-account-balance-table.yml::1::roran: Reason: liquibase.exception.DatabaseException: ERROR: syntax error at or near PARTITION Position: 93 [Failed 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 引导应用程序时添加索引时遇到错误。
liquibase.exception.MigrationFailedException: Migration failed for change set db/changelog/changes/1.create-account-balance-table.yml::1::roran: Reason: liquibase.exception.DatabaseException: ERROR: syntax error at or near PARTITION Position: [Failed 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.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 创建 table,然后通过编程方式创建索引或添加约束,如下所示
CREATE INDEX account_id_idx ON public.account_balance(account_id);
我在 liquibase 中为分区 table 使用 yaml 的方式有什么错误吗?
我正在使用 postgresql 11 版本和 liquibase spring boot 2.3.3.RELEASE
您的 ChangeSet
的 modifySql
类型也适用于您的 addUniqueConstraint
和 createIndex
类型。由于在 Index
和 UniqueConstraint
创建中添加了 PARTITION BY RANGE
,因此生成的 sql 出现异常。
只需将它分成两部分 - 一个包含 table 创建的 ChangeSet 和一个包含 Index
和 UniqueConstraint
创建的 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