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 条件,而且我不知道如何为所有行传递属于同一行的标识。

感谢任何帮助。提前致谢。

【问题讨论】:

UPDATE Promotion SET new_column=ARRAY[old_column] 这个正在工作,但正在检查除本机查询之外的任何替代方案。 不正确:postgresql 确实允许 ALTER TABLE promotion ALTER COLUMN bar TYPE bigint[] USING array[ bar ]; 我发现了我的错误,因为我正在尝试将 newDataType 设置为 BIGINT[] 的 。谢谢,它更改了数据类型并重命名了列,但它没有复制原始数据。我错过了什么吗? 它应该将现有数据的副本转换为单元素数组。 【参考方案1】:

我认为将共享变更集拆分为 3 会更好:

    创建没有值的新列(并添加所有需要的约束/索引/外键等) 将数据从旧列复制到新列 删除旧列

这样的分离可以更容易地回滚每个操作 - 并且还可以将 ddl 和 dml 操作分开

【讨论】:

我也在做同样的事情,寻找更具体的 Liquibase 脚本更改。 UPDATE Promotion SET new_column=ARRAY[old_column] 这个正在工作,但正在检查除原生查询之外的任何替代方案。【参考方案2】:

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:将值从一列复制到具有数组数据类型的另一列的主要内容,如果未能解决你的问题,请参考以下文章

如果满足条件,熊猫将值从一列复制到另一列

SQL根据条件将值从一列复制到另一列

Pandas 根据非恒定值的第三列将值从一列复制到另一列

Postgres 创建触发器函数以在允许插入之前将值从一列复制到另一列

在同一个表中将值从一列复制到另一列

有效地将值从一列替换到另一列 Pandas DataFrame