2014-04-23 17 views
5

Potrzebuję skopiować zawartość tabeli z jednej bazy danych do innej bazy danych z identyczną tabelą, która jest obecnie pusta.pg_dump vs COPY (SELECT * FROM my_table)

Mam zamiar zrzucić dane tabeli ze starej tabeli, a następnie po prostu zaimportować ją do pustej tabeli w nowej bazie danych. Jednak napotkałem pewne zachowanie, którego nie rozumiem, używając pg_dump.

próbuję zrzucić dane z tabeli do pliku za pomocą polecenia:

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

To działa, ale pojawia się tylko 8 rejestrów i istnieje ponad 1000 rekordów w tabeli gdybym obejrzeć tabelę jak tak :

SELECT * FROM my_table; 

Tak, próbowałem użyć polecenia Kopiuj, aby wygenerować plik .csv i widzę podobne zachowanie:

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

Otrzymuję te same 8 rekordów, co pg_dump. Ale z:

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

Mam wszystkie 1266 rekordów.

Zakładam, że te polecenia powinny zwrócić te same dane, ale oczywiście jestem w błędzie. Jaka jest różnica?

+0

To całkiem szalone. Czy możesz pokazać wynik? –

+0

ile rekordów w '/ tmp/my_table.sql'? – xdazz

Odpowiedz

3

Czy to możliwe, że my_table jest częścią hierarchii dziedziczenia? Pytam, ponieważ http://www.postgresql.org/docs/9.0/interactive/sql-copy.html#AEN58984 ma to:

KOPIA dotyczy tylko konkretnej tabeli o nazwie; nie kopiuje danych do tabel podrzędnych ani z nich. Tak więc na przykład COPY table TO pokazuje te same dane, co SELECT * FROM ONLY table. Ale można użyć COPY (SELECT * FROM table) TO ... do zrzutu wszystkich danych w hierarchii dziedziczenia.

Powinieneś być w stanie sprawdzić, uruchamiając:

SELECT * FROM ONLY my_table; 

Jeśli to zwraca tylko 8 rejestrów następnie, że jesteśmy na właściwej drodze, a my po prostu trzeba znaleźć tabel podrzędnych (dla których How to find child tables that inherit from another table in PSQL będzie pomocne).

Jeśli nie, to nie jestem pewien - zastanawiałem się, czy może zaangażują się Reguły lub Wyzwalacze, ale nie widzę w tej chwili. Ale może daje to komuś pomysł?