2017-08-26 138 views
1

我想從MySQL表中導出數據並將該數據導入到PgSQl數據庫中。PostGreSQL CSV導入行分隔符

導出腳本從MySQL

select column_names from from table_name LIMIT 2 
INTO OUTFILE 'E:/CSV_files/record_main.csv' 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY ';' 

PGSQL導入腳本

COPY record_main("column_names ") FROM 'E:/CSV_files/record_main.csv' 
WITH DELIMITER ',' NULL '\N' ESCAPE ';' CSV 

上面的代碼工作對我來說很好,當我試圖導出和導入CSV。

但是,當我增加選擇限制1至2或任何,它會導致錯誤。

ERROR: extra data after last expected column CONTEXT: COPY record_main, line 1: >""12635","55025","1","ASCS","P","5320700","2015-01-01 >00:00:00",\N,\N,\N,\N,\N,\N,"DEED",\N,\N,\N,\N,..."

然後打開CSV文件,我手動將一行數據分成兩行數據。

我從每行的末尾刪除了分號。

這次它工作正常。 我覺得在行分隔符錯誤。我的問題是我怎麼能說到PgSQl到行分隔符是這個。像我給出的DELIMITER

回答

2

據我所知,PostgreSQL的copy statement預計行通過新行字符(S)分開:

COPY FROM can handle lines ending with newlines, carriage returns, or carriage return/newlines.

所以,你必須調整mysql的出口使用新行字符作爲行分隔符,或者您需要預處理轉儲以用新行替換;字符。

1

this SO question你應該使用COPY語法是:

COPY record_main FROM 'E:/CSV_files/record_main.csv' DELIMITERS ',' CSV; 

正如你所看到的,這是你想要運行的命令不同。但COPY在數據庫服務器上運行並需要一個root帳戶。如果你沒有一個,你也可以嘗試使用\copy

\copy record_main(col1, col2, ...) FROM 'E:/CSV_files/record_main.csv' 
    DELIMITER ',' CSV 

更新:

@shadow正確地指出,你需要你的MySQL數據導出到其線條是一個CSV文件用行分隔符分隔,而不是分號。但是你的Postgres複製語法看起來不對,所以也許這個答案仍然會對你有幫助。

+0

在\ copy文件名中不使用引號。 – Jasen

0

謝謝你們,

我做錯了這裏通過給錯了行分隔符而從MySQL創建CSV。

正確答案

INTO OUTFILE 'E:/CSV_files/record_main-new.csv' 
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n' 

沒有必要指定自動PostgreSQL的行分隔符或默認"\n"

從CSV到PostgreSQL進口。

FROM 'E:/CSV_files/record_main-new.csv' 
WITH DELIMITER ',' NULL '\N' CSV