Liquibase:将值从一列复制到具有数组数据类型的另一列
Posted
技术标签:
【中文标题】Liquibase:将值从一列复制到具有数组数据类型的另一列【英文标题】:Liquibase: Copy value from one column to another that has array data-type 【发布时间】:2021-08-26 21:43:30 【问题描述】:我正在使用带有 LiquibaseScript 的 PostgreSQL。
我正在尝试将列的数据类型从 BIGINT 更改为 BIGINT[]。由于底层数据库不允许更改,我正在创建一个类型为 BIGINT[] 的新列并删除 int 一个。 我需要将现有数据从旧列复制到新列,逐行复制。 我尝试了以下更改
`<addColumn tableName="table1">
<!-- <column name="new_column" type="BIGINT[]" value="ARRAY[old_column]"></column> -->
<column name="new_column" type="BIGINT[]" value="(select ARRAY[old_column] from table1)"></column>
</addColumn>`
第一个选项没有抛出任何错误,但没有工作。 第二个选项不起作用,因为它需要 where 条件,而且我不知道如何为所有行传递属于同一行的标识。
感谢任何帮助。提前致谢。
【问题讨论】:
ALTER TABLE promotion ALTER COLUMN bar TYPE bigint[] USING array[ bar ];
我发现了我的错误,因为我正在尝试将 newDataType 设置为 BIGINT[] 的 我认为将共享变更集拆分为 3 会更好:
-
创建没有值的新列(并添加所有需要的约束/索引/外键等)
将数据从旧列复制到新列
删除旧列
这样的分离可以更容易地回滚每个操作 - 并且还可以将 ddl 和 dml 操作分开
【讨论】:
我也在做同样的事情,寻找更具体的 Liquibase 脚本更改。addColumn
采用valueComputed
属性,允许您在表的两列之间复制值。
valueComputed
从函数返回的值或 过程调用。该属性将包含要调用的函数。
您可能想这样尝试:
<changeSet id="1" author="authorName">
<addColumn tableName="table1">
<column name="new_column" type="BIGINT[]" valueComputed="old_column"/>
</addColumn>
</changeSet>
我没有尝试过使用BIGINT[]
类型,但它适用于我的varchar
。
【讨论】:
以上是关于Liquibase:将值从一列复制到具有数组数据类型的另一列的主要内容,如果未能解决你的问题,请参考以下文章