테이블 교체
가끔은 다른 테이블로 테이블을 교체해야 할 때가 있습니다. 예를 들어 매우 큰 테이블의 데이터를 마이그레이션할 때는 보통 테이블의 사본을 만들고 이 새 테이블로 데이터를 삽입하고 마이그레이션하는 것이 더 나을 때가 많습니다.
예를 들어 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
이 작업은 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로 시작하게 됩니다. 기존 데이터에 따라 중복 키 제약이 발생하여 새 데이터를 만드는 사용자가 방해받을 수 있습니다.