このブログを検索

2020/02/16

postgresqlのcsvエクスポートとインポート

usersというテーブルに以下のようなレコードがあった。
                id                |               name
----------------------------------+----------------------------------
 paul                             | Paul McCartney
 pete                             | Pete Townshend
 john2                            | John Ryden
 bob                              | Bod Dylan
 john                             | John Lennon
bobの名前が間違っている。 Bob Dylanに直したい。 Excelあるいはテキスト感覚で直接テーブルを開いて書き換えたいところだが、 それはできない(よね?) csvでエクスポートインポートできるようなのでやってみた。
monqy=# COPY users TO '/var/lib/pgsql/users.csv' WITH CSV DELIMITER ',';
COPY 5
出力先は当然ながら書き込み権限が必要で、書き込み先に権限を与える(postgresの)か、書き込み権限のある場所にエクスポートする。 さっきのBob Dylanを直してインポートしようとしたら
monqy=# COPY users FROM '/var/lib/pgsql/users.csv' with csv;
ERROR:  duplicate key value violates unique constraint "users_pkey"
DETAIL:  Key (id)=(paul                            ) already exists.
CONTEXT:  COPY users, line 1
1件目の登録で already exists のエラーが。 上書きするオプションみたいなものは無いようで、一時的に作ったテーブルにインポートしてそこからupdateするとかいうことが必要らしい。 しょうがないので updateで更新。
monqy=# UPDATE users set name = 'Bob Dylan' where id = 'bob';
UPDATE 1
monqy=# select id,name from users;
                id                |               name
----------------------------------+----------------------------------
 paul                             | Paul McCartney
 pete                             | Pete Townshend
 john2                            | John Ryden
 john                             | John Lennon
 bob                              | Bob Dylan
(5 rows)
更新後のテーブルを表示すると更新したレコードが最後になっている。 削除・登録になっているのか?