我有一张桌子,叫它MyTable
。它是Postgresql数据库的一部分。
在MyTable
其中有很多条目,比如说超过一百万。我想在此表中添加一个字段,我们称之为MyNewField
。它是由ActiveRecord迁移添加的。
此字段应没有默认值,并且不能为空。结果,在它的迁移类中将是这样的:
class AddMyFieldToMyTable < ActiveRecord::Migration
def change
add_column :my_table, :my_field, :text, null: false
end
end
但是,它将触发错误(PG :: NotNullViolation),因为该表已包含行,所有行都将MyField
设置为NULL。
我想做的是:添加没有默认值并将nullable设置为false的行(不触发PG :: NotNullViolation)。然后,将另一个表中的值插入每个记录。
通过添加可为null设置为true的字段,然后添加值,然后再更改为可为null设置为false,可以实现此目的。但是,我很想知道是否有可能一次完成。
您必须确保另一个表具有my_table中每个条目的my_field值。
class AddMyFieldToMyTable < ActiveRecord::Migration
def up
add_column :my_table, :my_field, :text
execute("insert into my_table(my_field) values (select my_field from different_table where my_table.id = different_table.different_id)")
change_column :my_table, :my_field, :text, null: false
end
def down
remove_column :my_table, :my_field
end
end
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句