2013-07-23 41 views
2

我對PostgreSQL非常新。其實我以前使用MySQL,但由於某些項目特定的原因,我需要使用PostgreSQL並執行POC。MySQL負載數據INFILE與PostgreSQL COPY FROM命令

現在的問題是: 我正在使用MySQL LOAD DATA INFILE命令將列內容從文件加載到我的數據庫表中。

我的表結構是: 表名:MSISDN 表的列名:ID(主鍵 - AUTO_GENERATED),JOB_ID,MSISDN,地區,STATUS

但我輸入的文本文件(rawBase.txt)是具有隻有低於列: MSISDN,地區

所以我正在使用以下命令加載這些上面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和狀態)列。

NOW,

在PostgreSQL的情況下,我想同樣的事情發生。

也有同類的命令可用COPY從 象下面這樣:

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

,但我不能夠設置一個特定的初始值,其餘的列中不存在(JOB_ID和狀態)在我的輸入文本文件中。我沒有得到任何有成效的例子。

如果可能,請給出一些建議。

問候, 桑迪

+1

您可以將數據加載到臨時表中,並使用'INSERT ... SELECT ...'將其從臨時表複製到真正的表中? –

+0

lgor ..感謝您的評論,但作爲文件副本是非常巨大的記錄因此使用臨時表將是耗時的任務。 – Sandy

回答

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上做了一個快速演示我的意思。關鍵是,需要非CSV值的列已設置爲DEFAULT,並且您在COPY中指定了列列表,例如COPY (col1, col2)

不幸的是,沒有相應的COPY特定的SET,你想在那裏。正如伊戈爾所建議的那樣,您可以通過臨時表進行舞臺表演,然後按INSERT INTO ... SELECT進行舞臺表演,如果您不能或不想ALTER表格設置列DEFAULT s。

+0

克雷格..感謝您的評論,但默認不會爲我工作。因爲job_id的初始值對於每個文件副本都是不同的。 – Sandy

+0

@Sandy在Postgres中'ALTER TABLE'語句是事務性的。您可以在每次導入作業的交易開始時進行設置,並且它們不會互相干擾。而且,在交易結束時 - 只需恢復到舊的默認值即可。 –

+0

@IgorRomanchenko這是一半正確的。 'ALTER TABLE'是事務性的,但是*它會在表*上使用'ACCESS EXCLUSIVE'鎖來防止併發讀寫。所以你可以把它回滾,當然,但它仍然是很大的破壞性。在這種情況下,最好的選擇是按照你的建議 - 階段到臨時表,然後做一個'INSERT INTO ... SELECT',如上所述。 –

2

你可以做到這一點的「Unix的」使用管道:

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

現在從它出現您正在使用MS-Windows中的問題的文件的路徑,但在Unix外殼和命令行工具如awk可用於Windows通過MSYSCygwin