2

私はPostgreSQLに非常に慣れていません。実際、以前は MySQL を使用していましたが、プロジェクト固有の理由により、postgreSQL を使用して POC を行う必要があります。

問題は次のとおりです。MySQL LOAD DATA INFILE コマンドを使用して、列の内容をファイルからデータベース テーブルにロードしていました。

私のテーブル構造は次のとおりです。テーブル名:MSISDN テーブル列名:ID(主キー - 自動生成)、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;

入力テキスト ファイルに存在しない列 (JOB_ID および STATUS) の特定の初期値を設定できる LOAD DATA INFILE コマンドで使用可能なオプションがあることがわかります。

今、

postgreSQL の場合は、同じことをしたいです。

以下のように、同じ種類の COPY FROM を使用できるコマンドもあります。

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

しかし、入力テキスト ファイルに存在しない残りの列 (JOB_ID と STATUS) に特定の初期値を設定することはできません。これを行う実りある例は得られません。

可能であれば何か提案をお願いします。

よろしく、サンディ

4

2 に答える 2

2

COPYcolumn-list を使用して、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、stdin ではなくファイルから ing を実行しています。私が意味することの簡単なデモのために、標準入力でそれを行いました。重要なことは、CSV にない値を必要とする列にはDEFAULTs が設定されておりCOPY、たとえばCOPY (col1, col2).

残念ながら、そこに必要な COPY 固有のものに相当するものはありSETません。テーブルに列を設定INSERT INTO ... SELECTできない場合、または設定したくない場合は、Igorが提案したように、一時テーブルを介してステージングして実行できます。ALTERDEFAULT

于 2013-07-23T07:49:37.807 に答える