DBにデータを追加する際、一番最初に思いつくのは、INSERTではないでしょうか。
しかし、多くのデータを追加する際にINSERTを使用すると時間がかかってしまいます。
そんな時に、役に立つのは\copyコマンドです!
使い方を覚えて効率よくデータ追加を行えるようにしましょう!!
COPYと\copyの違い
PostgreSQLにはCOPYというデータのインポート・エクスポート用のコマンドがありますが、\copyはそのpsqlクライアント版です。
| コマンド | 実行場所 | 権限 |
|---|---|---|
COPY | サーバー側 | スーパーユーザー権限が必要 |
\copy | クライアント側 (psql) | 一般ユーザーでも利用可能 |
COPYはサーバー側で動作するため、スーパーユーザー権限が必要です。一方、\copyはクライアント側で動作し、一般ユーザーでも実行できます。そのため、セキュリティ上の制約が少なく、手軽にデータを扱えます。

★サーバー側(PostgreSQLサーバー)
・実際にデータベースを管理している PostgreSQL本体 のこと
・データの読み書きやクエリの実行はここで行われる
・サーバーがアクセスできるパス に書き出すので、サーバー上のファイルシステムに依存
★クライアント側(psql)
・サーバーに接続して操作する ユーザー側のツール
・自分のPC上で動く psql などが該当
・クライアントPC上のパス に書き出す
→ サーバーではなく、自分のPCに直接ファイルを作れる。
データをテーブルにインポートする
\copy my_table FROM 'data.csv' WITH (FORMAT csv, HEADER true);
<ポイント>・data.csv のデータを my_table に読み込む
・FORMAT csv でCSV形式を指定
・HEADER true でヘッダー行をスキップ
CSVファイルの書き方
\copy を使用するためには、適切なフォーマットのCSVファイルを準備する必要があります。基本的なCSVの構造は以下のようになります。
例:data.csv
id,name,age
1,Alice,25
2,Bob,30
3,Charlie,28
<ポイント>
・1行目はカラム名(HEADER true を指定した場合は無視される)
・各データをカンマ , で区切る
・文字列データに "(ダブルクォート)を付けることも可能
・NULL値は空白(,,)にする
テーブルのデータをエクスポートする
\copy my_table TO 'output.csv' WITH (FORMAT csv, HEADER true);
<ポイント>
・my_table のデータを output.csv に出力
・HEADER true でヘッダーを付ける
\copyの便利なオプション
\copyを使う際、以下のオプションを活用するとより柔軟にデータを扱えます。
デリミタを変更する
\copy my_table FROM 'data.tsv' WITH (FORMAT csv, DELIMITER E'\t', HEADER true);
TSV(タブ区切り)ファイルを読み込む場合は、DELIMITER E'\t' を指定します。
NULLの扱いを指定する
\copy my_table FROM 'data.csv' WITH (FORMAT csv, NULL 'NULL', HEADER true);
データ内の NULL という文字列を SQL の NULL として扱う場合に便利です。
クォート文字を指定する
\copy my_table FROM 'data.csv' WITH (FORMAT csv, QUOTE '"', HEADER true);
データ内のカンマを正しく処理するために、QUOTE '"' を指定できます。
まとめ
業務で使った¥copyを調べてみたら、思っていたよりもできることが多かったので、これからたくさん活用しておこうと思います。
次回は、COPYと¥copyのメリットデメリットについて学んでいきたいと思います。


