2014-04-23 21 views
5

Bir tablonun içeriğini bir veritabanından başka bir veritabanına şu anda boş olan bir tabloya kopyalamam gerekiyor.pg_dump vs KOPYA (SELECT * FROM my_table)

Tablo verilerini eski tablodan dökmeyi ve ardından yeni veritabanındaki boş tabloya aktarmayı planlıyorum. Ancak, pg_dump kullanarak anlamadığım bazı davranışlara rastladım.

Ben komutuyla bir dosyaya tablo veri dökümü deneyin:

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

Bu çalışır, ancak ben şöyle tablosunu görüntülemek eğer sadece 8 kayıtları almak ve tabloda 1000'den fazla kayıt var :

SELECT * FROM my_table; 

Yani, bir .csv dosyası oluşturmak için COPY komutunu kullanmaya çalıştı ve ben benzer bir davranışla:

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

pg_dump ile aynı 8 kaydı alıyorum. Ancak aşağıdakilerle birlikte:

Tüm 1266 kayıtlarını alıyorum.

Bu komutların hepsinin aynı verileri döndürmesi gerektiğini varsayalım, açıkçası yanılıyorsunuz. Fark ne?

+0

Bu oldukça çılgın. Çıkışı gösterebilir misin? –

+0

'/ tmp/my_table.sql'de kaç kayıt var? – xdazz

cevap

3

my_table, miras hiyerarşisinin bir parçası mıdır? Bunu soruyorum, çünkü http://www.postgresql.org/docs/9.0/interactive/sql-copy.html#AEN58984, bu:

KOPY, yalnızca belirli bir tablo ile ilgilenir; Çocuk tablolarına veya çocuk tablolarına veri kopyalamaz. Böylece örneğin COPY table TO, SELECT * FROM ONLY table ile aynı verileri gösterir. Ancak COPY (SELECT * FROM table) TO ..., tüm verileri bir kalıtım hiyerarşisinde bırakmak için kullanılabilir.

Sen çalıştırarak kontrol etmek mümkün olmalıdır: biz doğru yolda olduğumuzu o zaman sadece 8 kayıtları dönerse

SELECT * FROM ONLY my_table; 

ve biz sadece çocuk tabloları bulmalıyız (bunlar için How to find child tables that inherit from another table in PSQL yararlı olacaktır).

Eğer emin değilse - Eminim Kurallar veya Tetikleyiciler devreye giriyor mu diye merak ettim, ama şu anda nasıl olduğunu göremiyorum. Yine de, belki başka birine bir fikir verir ...