【PostgreSQL】\copyコマンドを徹底解説!①

DB

DBにデータを追加する際、一番最初に思いつくのは、INSERTではないでしょうか。
しかし、多くのデータを追加する際にINSERTを使用すると時間がかかってしまいます。

そんな時に、役に立つのは\copyコマンドです!
使い方を覚えて効率よくデータ追加を行えるようにしましょう!!

COPYと\copyの違い

PostgreSQLにはCOPYというデータのインポート・エクスポート用のコマンドがありますが、\copyはそのpsqlクライアント版です。

コマンド実行場所権限
COPYサーバー側スーパーユーザー権限が必要
\copyクライアント側 (psql)一般ユーザーでも利用可能

COPYはサーバー側で動作するため、スーパーユーザー権限が必要です。一方、\copyはクライアント側で動作し、一般ユーザーでも実行できます。そのため、セキュリティ上の制約が少なく、手軽にデータを扱えます。

データをテーブルにインポートする

\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のメリットデメリットについて学んでいきたいと思います。

タイトルとURLをコピーしました