2012-03-29 4 views
0

Можно создать дубликат:
Bulk Insert of hundreds of millions of recordsИспользование INSERT INTO для ascii/внешних файлов?

Так что я был просто интересно, если это было возможно использовать INSERT INTO для, скажем 700k строки внешнего текстового файла в таблицу, которая уже создана и с существующие в нем данные? Значения Al одинаковы, просто мой коллега сказал мне использовать эту команду вместо COPY. Является ли этот комментарий ложным?

Заранее спасибо.

PS: Я использую PosgtreSQL/PGAdmin III

+0

Не знаю о COPY, я просто думаю, что было бы проще сделать это программно. Кроме того, вы должны быть осторожны с вашими типами полей. Я не знаю об Postgre, но я знаю, что в mySQL я сталкивался с проблемами некоторое время назад, когда пытался сохранить мегабайты данных в столбец TEXT, который не работал из-за ограничений размера данных. – ControlAltDel

+2

Если возможно, вы имеете в виду редактирование файла, чтобы сделать его скриптом 'SQL', тогда да, это возможно. Зачем вам это делать вместо использования 'copy'? –

ответ

1

Вы также можете отобразить текстовый файл в виде таблицы, используя внешнюю оболочку данных:

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

Два примера:

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/

После того, как вы нанесли на карту текстовый файл на таблицу, вы можете сделать

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

спасибо! это помогло! –

0

Технически, если ваш файл хорошо отформатирован как:

(f1, f2, f3, f4), 

Вы могли бы просто приписать:

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

В начале файл завершает все с помощью ; и запускает его как одну команду SQL. Проблема заключается в 700 тыс. Строк, я даже не знаю, сможет ли PostgreSQL даже разобрать синтаксический анализ. Мои деньги в том, что это не будет, но вы можете попробовать. Для получения дополнительной документации см. this page.

Теперь, если вы согнуты на не используя COPY то я хотел бы посмотреть на написание простого Perl или Python скрипт, который будет выполнять следующие функции:

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

Где $sth это INSERT заявление, подготовленное к базе данных.

Смежные вопросы