テーブルの交換
あるテーブルを別のテーブルに置き換える必要がある場合があります。たとえば、非常に大きなテーブルのデータをマイグレーションする場合、テーブルのコピーを作成し、バックグラウンドでこの新しいテーブルにデータを挿入してマイグレーションする方がよい場合があります。
例えば、テーブルevents
をevents_for_migration
と入れ替えたいとします。 この場合、3つのステップを踏む必要があります:
-
events
の名前を次のように変更します。events_temporary
-
events_for_migration
の名前を次のように変更します。events
-
events_temporary
の名前を次のように変更します。events_for_migration
Railsではrename_table
:
rename_table :events, :events_temporary
rename_table :events_for_migration, :events
rename_table :events_temporary, :events_for_migration
この場合、rename_table
の3つの呼び出しが_同じ_データベーストランザクション内で実行される限り、ダウンタイムは必要ありません。Railsはデフォルトでマイグレーションにデータベーストランザクションを使用しますが、使用しない場合は手動でトランザクションを開始する必要があります:
Event.transaction do
rename_table :events, :events_temporary
rename_table :events_for_migration, :events
rename_table :events_temporary, :events_for_migration
end
スワップしたら、新しいテーブルの主キーをリセットする_必要が_あります。PostgreSQLの場合は、reset_pk_sequence!
:
reset_pk_sequence!('events')
主キーのリセットに失敗すると、新しく作成された行はID値1で始まります。既存のデータによっては、重複キー制約が現れ、ユーザが新しいデータを作成できなくなります。