我正在尝试从MySQL表导出数据并将该数据导入PgSQl数据库。
来自MySQL的EXPORT脚本
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 IMPORT脚本
COPY record_main("column_names ") FROM 'E:/CSV_files/record_main.csv'
WITH DELIMITER ',' NULL '\N' ESCAPE ';' CSV
当我尝试导出和导入CSV时,上面的代码对我来说很好。
但是当我将选择限制增加到1或2时,它会导致错误。
错误:上一个预期列之后的额外数据 背景:COPY record_main,第1行:>"" 12635"," 55025"," 1"," ASCS", " P"," 5320700"," 2015-01-01> 00:00:00",\ N,\ N,\ N,\ N, \ N,\ N,"契据" \ N,\ N,\ N,\ N,..."
然后打开CSV文件,我手动将一行数据分成两行数据。
我从每行的末尾删除了分号。
这次它工作正常。
我认为行分隔符中的错误。我的问题是我怎么能对PgSQl说行分隔符是这样的。比如我给了DELIMITER
答案 0 :(得分:2)
据我所知,postgresql的copy statement期望行由换行符分隔:
COPY FROM可以处理以换行符,回车符或回车符/换行符结尾的行。
因此,您必须调整mysql导出以将新行字符用作行分隔符,或者您需要预处理转储以用新行替换;
个字符。
答案 1 :(得分:2)
从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复制语法很容易,所以也许这个答案对你有帮助。
答案 2 :(得分: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