2012-03-29 3 views
0

Mögliche Duplizieren:
Bulk Insert of hundreds of millions of recordsVerwendung von INSERT INTO für ASCII/externe Dateien?

So war ich nur fragen, ob es möglich war, für INSERT INTO zu verwenden, sagen eine 700k Reihe externen ASCII-Datei in eine Tabelle, die bereits erstellt ist und mit bestehende Daten drin? Al-Werte sind die gleichen, nur ein Kollege hat mir gesagt, dass ich diesen Befehl anstelle von COPY verwenden soll. Ist dieser Kommentar falsch?

Vielen Dank im Voraus.

PS: Ich verwende PosgtreSQL/PGAdmin III

+0

Ich weiß nichts über COPY, ich denke nur, es könnte einfacher sein, dies programmgesteuert zu tun. Auch müssen Sie vorsichtig mit Ihren Feldtypen sein. Ich bin auf Postgre nicht so gut informiert, aber ich weiß, dass ich in mySQL vor einiger Zeit auf Probleme gestoßen bin, bei denen ich versucht habe, Megabytes an Daten in eine TEXT-Spalte zu speichern, was aufgrund von Beschränkungen der Datengröße nicht funktionierte. – ControlAltDel

+2

Wenn du meinst, dass du die Datei redest, um sie zu einer 'SQL'-Skriptdatei zu machen, dann ist es ja möglich. Warum würdest du es machen anstatt "copy" zu benutzen? –

Antwort

1

Sie können auch Ihre Textdatei als eine Tabelle mit einem Fremddaten Wrapper Karte:

http://www.postgresql.org/docs/current/static/file-fdw.html

Zwei Beispiele:

http://michael.otacoo.com/postgresql-2/postgresql-playing-with-foreign-data-wrappers-1/
http://www.depesz.com/2011/03/14/waiting-for-9-1-foreign-data-wrapper/

Sobald Sie die kartiert Textdatei in eine Tabelle, können Sie eine

tun
INSERT INTO target_table (col1, col2, col3) 
SELECT col1, col2, col3 
FROM fdw_table; 
+0

danke! das hat geholfen! –

0

Technisch gut, wenn Sie Ihre Datei wie formatiert ist:

Sie
(f1, f2, f3, f4), 

konnte einfach prepend:

INSERT INTO tbs(f1, f2, f3, f4) VALUES 

Zu Beginn des Die Datei beendet alles mit einem ; und versuchen Sie es als einen einzigen SQL-Befehl auszuführen. Problem ist mit 700k Zeilen Ich weiß nicht einmal, ob PostgreSQL überhaupt in der Lage sein wird, eine Aussage so lange zu analysieren. Mein Geld ist, dass es nicht geht, aber Sie können es gerne versuchen. Weitere Dokumentation finden Sie unter this page. Jetzt

wenn Sie gebogen sind nicht mit COPY dann würde ich in schauen ein einfaches Perl oder Python-Skript zu schreiben, das folgende tun würde:

while(<FILE>) 
{ 
    chomp; 
    @data_fields = split(/<delim>/, $_); 
    $sth->execute(@data_fields); 
} 

Wo $sth ist die INSERT Rechnung für die Datenbank.