Liquibase操作PostgreSQL:如何将BIGINT列值复制到BIGINT[]数组列
实现PostgreSQL字段从BIGINT到BIGINT[]的Liquibase变更方案
错误原因说明
你之前的写法不生效是因为<addColumn>标签的value属性仅支持传入静态常量,无法动态引用同表当前行的其他字段值;子查询写法会返回多行结果,因此触发要求添加where条件的报错。
正确操作步骤
- 第一步:先新增BIGINT[]类型的空列,不赋值
<addColumn tableName="table1"> <column name="new_column" type="BIGINT[]" /> </addColumn>
- 第二步:逐行迁移旧列数据到新列
使用valueComputed属性传入数据库计算表达式,实现每行旧值转数组写入新列:
<update tableName="table1"> <column name="new_column" valueComputed="ARRAY[old_column]" /> </update>
也可以直接使用原生SQL标签实现:
<sql> UPDATE table1 SET new_column = ARRAY[old_column]; </sql>
- 第三步(可选,数据校验无误后执行):删除旧列,按需将新列重命名为原列名
<dropColumn tableName="table1" columnName="old_column" /> <renameColumn tableName="table1" oldColumnName="new_column" newColumnName="old_column" />
注意事项
- 执行变更前必须备份表数据,避免操作失误导致数据丢失
- 若操作的是大表,需提前评估全量更新的锁表时长对业务的影响
- 建议添加
<rollback>标签配置回滚逻辑,方便变更失败时快速恢复
内容的提问来源于stack exchange,提问作者LearnerOP
相关产品推荐
相关产品推荐

