insertの場合は\copy
コマンドを使えばいいのだが、updateの場合はそうはいかないみたい。
↑のstack overflowの回答にある通り、
やり方
- updateしたいCSVデータを一旦
tmp
テーブルを作成しそこにインポート -
tmp
データのデータでUpdateしたいテーブルにupdate
をかける
例えば以下のようにする。
-- Create tmp table (セッション内のみ有効なテーブル):
create temp table tmp (id int, issuedate__c datetime)
-- Import data from csv:
\copy tmp from '/path/to/file.csv' with null '' csv;
-- Update table from tmp
update
"users"
set
id = tmp.id,
created_at = tmp.created_at
where
"users".id = tmp.id
-- これはやらなくてもセッションが切れたと時に自動で削除される
drop table tmp;
!注意!
ここで注意なのが、アップデートかけたいレコード数が巨大な場合、temp_buffers
の値を大きくし、tmpテーブル
にインデックスを張らないと処理落ちしてしまう、とのこと。
-- Set temp_buffer:
SET temp_buffers = 500MB; -- example value
-- Add index to the temporary table:
CREATE INDEX tmp_id_idx ON tmp(id);
-- Analyze indexes info
ANALYZE tmp;