테이블 교환

때때로 한 테이블을 다른 테이블로 교체해야 할 필요가 있습니다. 예를 들어, 매우 큰 테이블에서 데이터를 마이그레이션할 때는 테이블의 복사본을 만든 다음 이 새로운 테이블에 데이터를 백그라운드로 삽입 및 마이그레이션하는 것이 더 좋습니다.

events 테이블을 events_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

이 3개의 rename_table 호출이 같은 데이터베이스 트랜잭션 내에서 실행되는 한 다운타임이 필요하지 않습니다. 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로 시작하게 됩니다. 기존 데이터에 따라 이는 중복 키 제약 조건이 발생하여 사용자가 새 데이터를 생성하는 것을 방해할 수 있습니다.