0

我偶然发现了一个我认为很常见但我不经常听到的场景。

所以,我有一种情况,我用另一列扩展了我现有的数据库表,该列应该为每个客户存储非常具体的唯一值。当我在系统中创建新记录时,该列将被填充并且工作正常。但是,现在的问题是我有一堆在介绍本专栏之前就已经存在的旧记录,它们是空的,因此代码无法正确执行。

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

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

4

2 回答 2

0

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

 migration/V4__add_column1_table1
 migration/V5__fix_table1_column1_nulls

并在脚本内运行:

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

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

于 2020-03-03T14:27:37.847 回答
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);
    
于 2021-05-06T09:19:44.507 回答