2016-10-19 11 views
0

データをPostgreSQL 9.5データベースにインポートする実際のシステムを、CSVファイルからより効率的なシステムに切り替えることをお勧めします。Postgresの静的フィールドを持つCSVからコピー

私はCOPYステートメントを使用したいのですが、パフォーマンスが良いからです。問題は、CSVファイルにない1つのフィールドに値を設定する必要があることです。

COPYステートメントに挿入されたすべての行に静的フィールドを追加する方法はありますか? 完璧なソリューションは、そのように見えただろう:

COPY data(field1, field2, field3='Account-005') 
FROM '/tmp/Account-005.csv' 
WITH DELIMITER ',' CSV HEADER; 

あなたはすべての行に移入そのフィールドを持ってする方法を知っていますか?

私のサーバはnode.jsを実行していますので、ノードを使用してファイルをコピーする前に、ノードを使用してファイルを完成させるための費用対効果の高いソリューションを公開しています。列のデフォルトを設定

+0

一時テーブルにインポートし、「データに挿入(...)」を選択してください。「Account-005」from temp;「 – wildplasser

+0

」賢い!答えとして追加し、私はそれを受け入れます –

答えて

0

はにインポートする一時テーブルを使用します。

alter table data 
alter column field3 set default 'Account-005' 

はそれcopyコマンドは言及しないでください。これは、あなたがすることができます:

  • は、更新列
  • は、新しいレコードを挿入する前に、(例えば重複として)

をレコードを削除または無視し、余分なリテラルデータを追加/削除/追加します実際のテーブルに追加します。


 -- target table 
CREATE TABLE data 
    (id SERIAL PRIMARY KEY 
    , batch_name varchar NOT NULL 
    , remote_key varchar NOT NULL 
    , payload varchar 
     , UNIQUE (batch_name, remote_key) 
     -- or:: 
     -- , UNIQUE (remote_key) 
    ); 
     -- temp table 
CREATE TEMP TABLE temp_data 
    (remote_key varchar -- PRIMARY KEY 
    , payload varchar 
    ); 

COPY temp_data(remote_key,payload) 
FROM '/tmp/Account-005' 
    ; 

     -- The actual insert 
     -- (you could also filter out or handle duplicates here) 
INSERT INTO data(batch_name, remote_key, payload) 
SELECT 'Account-005', t.remote_key, t.payload 
FROM temp_data t 
    ; 

ところで上記を自動化することが可能である:引数として文字ファイル名を/使用して、機能(または多分プリペアドステートメント)にそれを置きます。

0

COPY data(field1, field2) FROM... 
+0

偉大なアイデアしかし、私の文脈(および異なるfield3)で他の関数で行を作成することができますので、 –

関連する問題