我偶然发现了一种我认为很普遍的场景,但是我却很少听到。
因此,我遇到了这样的情况:我用另一列扩展了现有的数据库表,该列应该为每个客户存储非常特定的唯一值。当我在系统中创建新记录时,该列将被填充并且可以正常工作。 但是,现在的问题是,在引入此列之前,我有一堆较早的记录,并且它们为空,因此代码无法正确执行。
我很好奇这个问题通常是如何解决的?为了用有效值填充此列,我唯一的解决方案是运行一个脚本,该脚本将从一个表中提取值并将其插入到另一个表中,但是也许有一个更标准化的解决方案吗?
我正在使用spring boot和flyway进行db迁移,如果有与此相关的解决方案,那将很棒。
答案 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。
添加没有唯一约束的新列
alter table my_table add column my_new_column varchar(255);
用另一个表中的数据填充该表。
可以根据需要更新下面的子查询以从另一个表中提取数据
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);
添加唯一约束:
alter table my_table add constraint my_table_my_new_column_uk unique (my_new_column);