すでに入力されているデータをクリアせずに、文字列であるフィールドを整数に変更することは可能ですか?
問題のテーブルの現在のdb構造は次のとおりです。
create_table :people do |t|
t.string :company_id
これは移行を使用して可能ですか?
移行時に古いフィールドを削除し、整数である新しいフィールドを作成することを考えています。しかし、これにより、すでに入力されているすべてのデータが消去されるのではないかと心配しています。
ありがとう、
ダニー
列を削除しないでください。データが消去されます。
ただし、試すことはできます
change_column :people, :company_id, :integer
company_id
のすべての値をinteger
に変換できる場合は、問題ないはずです。
そうでない場合(つまり、デフォルトですべての文字列を変換できるわけではない場合)、2つのステップで実行できます。1)新しい列を作成し、変換後にそこにcompany_id
をロードします。 2)company_idをドロップしてから、新しい列の名前を変更します。
両方の方法に注意する必要があります(2番目の方法の場合はさらに注意してください)。可能であれば、おそらくデータベースのコピーに対して最初に行う必要があります。
列をドロップしないでください、これを使用してください
change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'
PostgreSQLから得た「ヒント」は、基本的に、これを実現するかどうか、およびデータをどのように変換するかを確認する必要があることを示しています。変更を確認するには、移行で上記のブロックを使用します
他の答えは正しいですが、:using
キーワードを使用してさらに一歩進めることができます。
change_column :people, :company_id, :integer, using: 'company_id::integer'