2014-04-23 6 views
5

하나의 데이터베이스에서 현재 비어있는 동일한 테이블을 가진 다른 데이터베이스로 테이블 내용을 복사해야합니다.pg_dump 대 COPY (SELECT * FROM my_table)

이전 테이블에서 테이블 데이터를 덤프 한 다음 새 데이터베이스의 빈 테이블로 가져 오면됩니다. 그러나, 나는 pg_dump를 사용하여 이해할 수없는 행동을했다.

는 내가 명령을 파일에 테이블 데이터를 덤프하려고 :

pg_dump -a -t '"my_table"' my_database > /tmp/my_table.sql 

이 작동하지만, 내가 지금처럼 테이블을 볼 수 있다면 난 단지 (8 개) 기록을 얻고 테이블에 1000 레코드가 :

SELECT * FROM my_table; 

그래서, .csv 파일을 생성하는 COPY 명령을 사용하려고 나는 비슷한 동작을 참조하십시오

COPY my_table TO '/tmp/my_table.csv' WITH CSV HEADER; 

나는 pg_dump와 같은 8 개의 레코드를 얻는다. 하지만, 함께 :

COPY (SELECT * FROM my_table) TO '/tmp/my_table.csv' WITH CSV HEADER; 

나는 모든 1266 레코드를 얻습니다.

나는이 명령들이 모두 같은 데이터를 리턴해야한다고 생각하지만 분명히 틀렸다. 그 차이점은 무엇입니까?

+0

꽤 이상합니다. 결과물을 보여줄 수 있습니까? –

+0

'/ tmp/my_table.sql'에 얼마나 많은 레코드가 있습니까? – xdazz

답변

3

my_table이 상속 계층 구조의 일부일 수 있습니까? 나는 http://www.postgresql.org/docs/9.0/interactive/sql-copy.html#AEN58984이 이것을 가지고 있기 때문에 묻습니다 :

COPY는 명명 된 특정 테이블 만 처리합니다. 데이터를 하위 테이블간에 복사하지 않습니다. 따라서 예를 들어 COPY table TOSELECT * FROM ONLY table과 동일한 데이터를 표시합니다. 그러나 COPY (SELECT * FROM table) TO ...은 상속 계층 구조의 모든 데이터를 덤프하는 데 사용할 수 있습니다.

당신은 실행하여 확인 할 수 있어야한다 : 즉 우리가 올바른 궤도에있어 다음 만 8 개 레코드를 반환하는 경우

SELECT * FROM ONLY my_table; 

을, 우리는 단지 자식 테이블을 찾을 필요 (하는 How to find child tables that inherit from another table in PSQL이 도움이 될 것입니다.)

그렇다면 확실하지 않습니다. 어쩌면 규칙이나 트리거가 참여하고 있는지 궁금해하지만 지금은 볼 수 없습니다. 그럼에도 불구하고 다른 사람에게 아이디어를 줄 수 있나요?