2014-05-20 4 views
2

외부 소스를 통해 채워지는 포스트 그리드에 students 테이블이 있습니다. 매일 밤 students_swap 테이블에 데이터를 채운 다음 장시간 작업이 완료되면 students으로 이름을 바꾼 다음 원본 테이블이 다음 날 사용되는 students_swap이됩니다.postgresql에서 * _swap 테이블 (w/인덱스)을 만드는 방법

이 문제는 원래 테이블에 새 열이나 인덱스를 추가 할 때 스왑 테이블에서도 마찬가지입니다. 나는 다음과 같은 승 /이 중 일부를 자동화하기 위해 시도하고있다 :

-- Drop the swap table if it's already there... 
DROP TABLE IF EXISTS students_swap; 

-- Recreate the swap table using the original as a template... 
CREATE TABLE students_swap AS SELECT * FROM students WHERE 1=2; 

... populate the swap table .... 

ALTER TABLE students RENAME TO students_temp; 
ALTER TABLE students_swap RENAME TO ps_students; 
ALTER TABLE students_temp RENAME TO students_swap; 

이 테이블 구조를 만들기 위해 잘 작동하지만 인덱스가 스왑 테이블에 대해 생성되지 않습니다.

제 질문은 원래 테이블과 스왑 테이블이 동기화 상태를 유지하도록 테이블 구조 외에도 모든 인덱스를 어떻게 복사합니까? 대신

+0

대체 시나리오 : 1) pg_dump를 사용하여 스키마 덤프 2) 스키마 이름 바꾸기 3) 다시 작성하고 덤프에서 스키마를 가져옵니다. – joop

답변

6

사용 create table ... like :

CREATE TABLE students_swap (LIKE students INCLUDING ALL); 

이 인덱스, 기본 키를 포함하고 제약 조건을 확인하지만 하지 외부 키를 다시 작성합니다 것입니다.

편집 :

INCLUDING ALL 같은 순서로 채워진 컬럼에 대한 디폴트 설정 (예를 들어로 정의 serial 열)를 복사한다. 당신이 원하는 것처럼 들립니다. 원하지 않는 경우 INCLUDING INDEXES INCLUDING CONSTRAINTS을 대신 사용하십시오.

+0

또한 시퀀스는 공유되지만 원본 테이블에만 속합니다 (있는 경우). – pozs

+0

@pozs : 좋은 지적, 감사합니다 –

+0

굉장! 나는 그것이 존재한다는 것을 결코 알지 못했다! 나는 다음에 더 나은'CREATE TABLE' 문서를 만들어야한다고 생각한다 : p –

관련 문제