带有PostgreSQL COPY FROM命令的MySQL LOAD DATA INFILE

时间:2013-07-23 07:30:58

标签: mysql sql database postgresql

我对PostgreSQL很新。实际上我之前使用的是MySQL,但由于某些项目的具体原因,我需要使用postgreSQL并进行POC。

现在的问题是: 我使用MySQL LOAD DATA INFILE命令将列内容从文件加载到我的数据库表。

我的表结构是: 表名:MSISDN 表列名:ID(主键 - auto_generated),JOB_ID,MSISDN,REGION,STATUS

但是我的输入文本文件(rawBase.txt)只有以下列: MSISDN,REGION

所以我使用下面的命令加载了上面2列的初始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;

你可以看到LOAD DATA INFILE命令中有一个选项,我可以为输入文本文件中不存在的列(JOB_ID和STATUS)设置一个特定的初始值。

现在,

在postgreSQL的情况下,我希望发生同样的事情。

还有一种可用的命令COPY FROM 如下所示:

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

但是我无法为输入文本文件中不存在的其余列(JOB_ID和STATUS)设置特定的初始值。我没有得到任何富有成效的例子。

如果可能,请提供一些建议。

此致 沙

2 个答案:

答案 0 :(得分:3)

您可以使用管道“Unix方式”:

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

现在从问题中的文件路径看来你正在使用MS-Windows,但是通过MSYS或{{3}可以通过Unix shell和awk等命令行工具使用它们。 }}

答案 1 :(得分: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;我只是在stdin上做了一个快速演示我的意思。关键是要求不在CSV中的值的列设置DEFAULT,并在COPY中指定列列表,例如COPY (col1, col2)

遗憾的是,没有相应于您想要的COPY特定SET。如果您不能或不想INSERT INTO ... SELECT您的表格设置列ALTER,您可以通过临时表进行暂存并按DEFAULT进行,如Igor建议的那样。