2

我对 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)设置特定的初始值。我没有得到任何富有成效的例子。

如果可能的话,请给一些建议。

问候,桑迪

4

2 回答 2

3

您可以使用管道以“Unix 方式”执行此操作:

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

awk现在从问题中的文件路径看来,您正在使用 MS-Windows,但是可以通过MSYSCygwin为 Windows使用 Unix shell 和命令行工具。

于 2013-07-23T18:35:18.593 回答
2

COPY使用列列表,并DEFAULT在您未指定的表列上设置 a 。

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从文件而不是标准输入;我只是在标准输入上做了这个,以便快速演示我的意思。关键是需要不在 CSV 中DEFAULT的值的列已设置,并且您在 中指定列列表COPY,例如COPY (col1, col2)

不幸的是,没有与SET您想要的特定于 COPY 的等价物。INSERT INTO ... SELECT如果您不能或不想在ALTER您的表中设置 column DEFAULTs ,您可以通过临时表暂存并执行Igor 建议的操作。

于 2013-07-23T07:49:37.807 回答