我对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)设置特定的初始值。我没有得到任何富有成效的例子。
如果可能,请提供一些建议。
此致 沙
答案 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建议的那样。