테이블 교체

가끔은 한 테이블을 다른 테이블로 교체해야 할 때가 있습니다. 예를 들어 매우 큰 테이블의 데이터를 이전할 때는 보통 테이블의 사본을 만들고 이 새로운 테이블로 데이터를 삽입 및 이전하는 것이 더 나을 수 있습니다.

예를 들어 events 테이블을 events_for_migration으로 교체하려고 합니다. 이 경우 3단계를 따라야 합니다:

  1. eventsevents_temporary로 이름 바꾸기
  2. events_for_migrationevents로 이름 바꾸기
  3. events_temporaryevents_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')

기본 키를 재설정하지 않으면 새로 생성된 행이 1의 ID 값을 가지게 됩니다. 기존 데이터에 따라 새 데이터 생성을 방해하는 중복 키 제약이 발생할 수 있습니다.