2013-07-23 2 views
2

Я очень новичок в PostgreSQL. На самом деле я использовал MySQL раньше, но по какой-то конкретной конкретной причине мне нужно использовать postgreSQL и сделать POC.MySQL LOAD DATA INFILE с PostgreSQL COPY FROM command

Теперь проблема заключается в следующем: Я использовал команду MySQL LOAD DATA INFILE для загрузки содержимого столбца из файла в мою таблицу базы данных.

Моя структура таблицы: Имя таблицы: MSISDN столбцов таблицы Имена: ID (первичный ключ - auto_generated), JOB_ID, MSISDN, РЕГИОН, СТАТУС

Но мой входной текстовый файл (rawBase.txt) оказывает только ниже столбцов: MSISDN, REGION

поэтому я использовал команду ниже, чтобы загрузить эти выше столбцы с начальным JOB_ID и STATUS.

LOAD DATA INFILE 'D:\\project\\rawBase.txt' INTO TABLE MSISDN 
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n' 
(MSISDN,REGION) 
SET JOB_ID = 'XYZ1374147779999', STATUS = 0; 

, как вы можете видеть, что есть в наличии НАГРУЗКИ команды DATA INFILE вариант, где я могу установить конкретное начальное значение для столбцов, которые не присутствуют (JOB_ID и STATUS) во входном текстовом файле.

ТЕПЕРЬ,

в случае PostGreSQL, я хочу то же самое должно произойти.

Существует также такая же команда, доступная COPY FROM , как показано ниже:

COPY MSISDN FROM 'D:\\project\\rawBase.txt' WITH DELIMITER AS ',' 

, но я не в состоянии установить конкретное начальное значение для остальных столбцов, которые не присутствуют (JOB_ID и STATUS) в моем текстовом файле ввода. Я не получаю никакого плодотворного примера этого.

Пожалуйста, приведите предложение, если это возможно.

С уважением, Sandy

+1

Можете ли вы загрузить данные во временную таблицу и скопировать ее из временной таблицы в реальную с помощью «INSERT ... SELECT ...»? –

+0

lgor .. Спасибо за комментарий, но поскольку копия файла для очень большой записи, поэтому использование временной таблицы будет трудоемкой задачей. – Sandy

ответ

2

COPY с колонки списка и установить DEFAULT на столбцы таблицы не были заданы.

regress=> CREATE TABLE copydemo(a text not null, b text not null default 'blah'); 

regres=> \COPY copydemo(a) FROM stdin 
Enter data to be copied followed by a newline. 
End with a backslash and a period on a line by itself. 
>> blah 
>> otherblah 
>> \. 
regres=> SELECT * FROM copydemo; 
    a  | b 
-----------+------ 
blah  | blah 
otherblah | blah 
(2 rows) 

Вы вероятно COPY ИНГ из файла, а не стандартного ввода; Я просто сделал это на stdin для быстрой демонстрации того, что я имею в виду. Главное, что столбцы, которым требуются значения не в CSV, установлены DEFAULT s, и вы указываете список столбцов в COPY, например COPY (col1, col2).

К сожалению, эквивалент SET, который вы хотите, отсутствует. Вы можете пройти через временную таблицу и сделать INSERT INTO ... SELECT, как предложил Игорь, если вы не можете или не хотите ALTER свою таблицу, чтобы установить столбец DEFAULT s.

+0

Craig .. Спасибо за комментарий, но по умолчанию не будет работать для меня. поскольку начальное значение для job_id будет отличаться для каждой копии файла. – Sandy

+0

@Sandy In Postgres Операция 'ALTER TABLE' является транзакционной. Вы можете установить его в начале транзакции для каждого задания импорта, и они не будут мешать друг другу. И, в конце транзакции - просто верните старые значения по умолчанию. –

+0

@IgorRomanchenko Это неполноценно. «ALTER TABLE» является транзакционным, но * он принимает блокировку «ACCESS EXCLUSIVE» в таблице *, которая предотвращает одновременное чтение и запись. Таким образом, вы можете откатить его обратно, конечно, но это все еще много разрушительных. В этом случае наилучшим вариантом будет следовать вашему предложению - этап к временной таблице, а затем выполнить «INSERT INTO ... SELECT», как я изложил выше. –

2

Вы можете сделать это «Unix путь» с помощью трубы:

cat rawbase.txt | awk '{print $0",XYZ1374147779999,0"}' | psql -d dbname -c "copy MSISDN FROM stdin with delimiter AS ','" 

Теперь из файла путей в вопросе появляется вы используете MS-Windows, но через Unix оболочки и утилиты командной строки например awk доступны для Windows до MSYS или Cygwin.