为生产中的较旧数据库记录填充新创建的列?

时间:2020-03-03 14:19:17

标签: spring spring-boot flyway

我偶然发现了一种我认为很普遍的场景,但是我却很少听到。

因此,我遇到了这样的情况:我用另一列扩展了现有的数据库表,该列应该为每个客户存储非常特定的唯一值。当我在系统中创建新记录时,该列将被填充并且可以正常工作。 但是,现在的问题是,在引入此列之前,我有一堆较早的记录,并且它们为空,因此代码无法正确执行。

我很好奇这个问题通常是如何解决的?为了用有效值填充此列,我唯一的解决方案是运行一个脚本,该脚本将从一个表中提取值并将其插入到另一个表中,但是也许有一个更标准化的解决方案吗?

我正在使用spring boot和flyway进行db迁移,如果有与此相关的解决方案,那将很棒。

2 个答案:

答案 0 :(得分:0)

发生这种情况时,我只是制作了一个新的flyway迁移软件包,例如:

 migration/V4__add_column1_table1
 migration/V5__fix_table1_column1_nulls

并在脚本中运行:

update table1 set column1 = 'Default Value' where column1 is null;

也许存在更多干净的方法,但该修​​复程序对我有用。

答案 1 :(得分:0)

我遇到了类似的问题,我使用 flyway 脚本分 3 个步骤解决了它。这适用于 Postgres。

  1. 添加没有唯一约束的新列

    alter table my_table add column my_new_column varchar(255);
    
  2. 用另一个表中的数据填充该表。

可以根据需要更新下面的子查询以从另一个表中提取数据

   update my_table m set my_new_column=sq.value from (select value, foreign_id from another_table) as sq where sq.foreign_id=m.id;

同样可以使用当前表的现有列计算新列的新值:

   update my_table set my_new_column=concat(existing_column_1, existing_column_2);
  1. 添加唯一约束:

    alter table my_table add constraint my_table_my_new_column_uk unique (my_new_column);