テーブルの交換

あるテーブルを別のテーブルに置き換える必要がある場合があります。たとえば、非常に大きなテーブルのデータをマイグレーションする場合、テーブルのコピーを作成し、バックグラウンドでこの新しいテーブルにデータを挿入してマイグレーションする方がよい場合があります。

例えば、テーブルeventsevents_for_migration と入れ替えたいとします。 この場合、3つのステップを踏む必要があります:

  1. events の名前を次のように変更します。events_temporary
  2. events_for_migration の名前を次のように変更します。events
  3. 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で始まります。既存のデータによっては、重複キー制約が現れ、ユーザが新しいデータを作成できなくなります。