postgreSQLのCOPY コマンド&serial型について

このQ&Aのポイント
  • postgreSQLのCOPYコマンドを使用して、タブ区切りで保存したファイルをテーブルに流し込む方法について説明します
  • テーブルを作成する際に、SERIAL型を使用する場合、COPYコマンドでデータを一括登録する際にエラーが発生することがあります
  • 12万件近くのデータを手動で登録するのは困難な場合、自動発番が必要なファイルの書き方についても解説します
回答を見る
  • ベストアンサー

postgreSQLのCOPY コマンド&serial型について。

はじめまして。 最近からpostgreSQLを使ってデータベースを作っています。初めてのデータベース作成なので、少し手間取っていますが、宜しくお願いします。 テキストエディタを使って、タブ区切りで保存したファイルは、postgreSQLに、\copyコマンドでテーブルの中へ 流し込むことができると思いますが、テーブルを作成した際に、 CREATE TABLE ***(←テーブル名) (id SERIAL PRIMARY KEY,○○ △△,..........,); とテーブルを作ったのですが、1列目のSERIALが邪魔をするのか、COPYコマンドを使ってもテーブル内にデータが入っていきません・・・ エラーは『": can't parse "ne 119, pg_atoi: error in "』と返ってきます。 タブ区切りテキストファイルで、一括登録する際、serial型でうまく自動発番できるファイルの書き方とかありますか? 現在、仕事でデータベースを作っているのですが、扱っているデータの数が、12万件近くあるので、全てを手動で登録するのは、ちょっとキツイです・・・ 回答の方、宜しくお願いします。(質問の内容が、うまく伝わっていなかったら、ゴメンナサイ。)

質問者が選んだベストアンサー

  • ベストアンサー
  • noopee
  • ベストアンサー率38% (114/297)
回答No.2

再度。 もしかして、コンソールにコピペしてinsertしようとされているんでしょうか? それは12万件もあると非常に大変なのでは?? コンソールから流し込む場合、通信スピードに流し込むスピードがついていけない(言い方間違ってるかも)ので、そのような事態が起きるようです。 私もよくやってました。(爆) insertで吐き出されたものを保存したテキストをサーバにあげて、テキストのあるディレクトリに移動してからDB操作が出来る状態にし、そこから「\i テキスト名」で実行できると思います。 DB操作が出来る状態じゃなくても、「psql ~」で実行できるコマンドがあったような気がするんですが、ちょっと忘れてしまいました...すみません。

garam_masala
質問者

お礼

noopeeさん、無事に成功しました。 本当にありがとうございました。 これから、もっともっと勉強して、noopeeさんのように 人のお役に立てるようになりたいです。 ありがとうございました。

その他の回答 (1)

  • noopee
  • ベストアンサー率38% (114/297)
回答No.1

こんにちは。 私はcopyコマンドはなぜかうまくいかないことが多いので、普段あまり使いません。 特にシーケンスなんか絡むと出来ないものもあったりします。 私が知らないだけ、なのかもしれませんけど。 ちょびっと手間がかかりますが...。 まずserialを持たせないtableにデータをcopyします。 そのTableからpg_dumpで「insert into~」の書式付きでデータを吐き出し、本来のテーブルにinsertします。 主旨が違ってたらごめんなさいね。 補足ください。 PostgresSQLはMLもありますので、そちらの過去ログ等も覗いてみてはいかがでしょうか。

参考URL:
http://www.sra.co.jp/people/t-ishii/PostgreSQL/
garam_masala
質問者

補足

noopeeさん、とても分かりやすい回答ありがとうございました。 早速pg_dumpを使ってみました。 「insert into ...」文で、書き出すことには、成功したのですが、本来のテーブルにinsertしようとするときに(エディタ上の「insert into...」文を、コピー&ペーストをしているのですが)、最初の数行は、うまくinsertしてくれますが、10行以上の行を一度にペーストしようとすると、特に返ってくるエラーはないのですが、ペーストもされていません・・・ その状態になると、\qも、select文も(一切のコマンドが)使えなくなって(反応しなくなって)しまいます。 5行づつくらいだと、ペーストはできるのですが、本来、コピー&ペーストをしてもいいものなのでしょうか? それとも、私のやり方が間違っているのでしょうか? 非常に分かりにくい質問かと思いますが、宜しくお願いします。

関連するQ&A

  • copy コマンドの動作

    テキストファイルをpostgresの 'COPY'コマンドにてテーブルへ取り込みを行っています。 文字コードはEUC(CSV)からEUC(POSTGRES)です。 CSVの中で、半角のカナや記号のようなものが混じっていた場合など、COPYコマンドがエラーをおこします。 そこで実行が止まってしまい、テーブルへは何も入っていない状態になります。 COPYコマンドでエラーの起きた行は読み飛ばして取り込みを続けることは出来ないのでしょうか?

  • COPYコマンドによるTEXT取り込みについて

    PostgreSQLバージョン 9 OS:RedHat 現在Oracleからの移行でPostgreSQLにてTEXT取り込み処理を作成しています。 OracleではSQLLoaderを使用して取り込んでいましたが、 PostgreSQLではCOPYコマンドを使用すれば取り込みできるところまで調べました。 しかし、行末に区切文字があるためうまく取り込みできません。 【コマンド】 \copy hoge from 'hoge.txt' delimiters '|'; 【行末に区切文字がある場合NG】 AAA|BBB|CCC| ERROR: extra data after last expected column CONTEXT: COPY hoge, line 1: "AAA|BBB|CCC|" 【行末に区切文字がない場合OK】 AAA|BBB|CCC SQLLoaderでは行末の区切文字があっても取り込めましたが COPYコマンドでは取り込めないようです。 回避策はないのでしょうか? (取引先からのTEXTなので相談はして見ますがレイアウトの変更は難しいかもしれません。) 回避策がない場合、行末の区切文字を削除する方法はありますでしょうか? 行末だけの区切文字を削除する方法が分かりません。 (テキストは固定長でないため、桁数を指定した削除ができません) 行末区切文字削除の方法だけでも良いのでお願いします。

  • copyコマンドについて

    MS-DOSコマンド copy を使用して 隠しファイルを 別フォルダにcopyしたいのですが。 「ファイルが見つかりませんでした。」 というエラーが返ってきます。 どうすればいいのでしょう? 隠しファイルを MS-DOSコマンドで 隠しファイル じゃないファイルにする方法でも 助かります。

  • PostgreSQLのnull値について

    PostgreSQL7.2.3 で利用しています。 insert文を発行するときは null値は values(null); と実行します。 これは問題ないのですが COPY toコマンドを発行し、(カンマ区切り)csvに落とすと \N で落ちてきます。何か設定が悪いのでしょうか? 同じく、カンマ区切りのファイル 123,,,,5,66 とかを COPY fromコマンドでの受入を実行することもできません。 123,\N,\N,\N,5,66 だったら成功するようです。 こういうものなのでしょうか?

  • PostgreSQLログイン中にOSコマンド

    Oracleだと、SQLplusログイン中に、!をコマンドの前につければ、OSコマンドが使えます。 PostgreSQLで、ログイン中には同じような方法はありますか? copyコマンドで、CSVファイルに出力されたか確認する場合、lsコマンドでファイルの存在を確認したいのですが。 PostgreSQL初心者です。 ご存知の方いらっしゃいました、宜しくお願いします。

  • PostgreSQL テキストファイルのインポートができません

    初めて質問させていただきます。どうかよろしくお願いいたします。 PostgreSQL8.4を勉強始めたばかりです。 エクセルの社員一覧シートをタブ形式でD:\TEST\TEST.txtに作成いたしました。 このデータを社員テーブルにインポートしたいのですが 氏名の項目で名字と名前の間に半角の空白があり インポートできません。 ダブルコーテーションで氏名を囲むとできるのですが テーブルの項目にダブルコーテーションが入ってしまいます。 テキストファイル ------------------------------ 番号 氏名 生年月日 1 山田 太郎 19610101 2 山田 花子 19610101 社員テーブル ------------------------------- 項目名 データ型 番号 INT 氏名 VARCHAR(100) 生年月日 INT PostgreSQLではPSQLを使用しております。 インポートでは、COPYコマンドを使用しております。 COPY 社員テーブル FROM 'D:/TEST/TEST.txt'; ご教授の程、よろしくお願いいたします。

  • postgreSQL EUC-JPで運用 copy

    色々試してみましたがうまく行かず質問します。今までpostgreSQL9.6で標準のUTF8で使用していましたが今回postgreSQL12にして、データベースをEUC-JPで作成しました。postgresql.confの中のclient_encodeをSJISの定義もしました。 利用環境はtomcatでアプリを実行しており、その機能のひとつにpostgreSQLのファンクションを実行し、データをcsv出力しています(copy to)しかし、保存されたcsvはUTF8で出力されてしまいます。PSQLで直接copy toを実行するとSJISで出力されます。該当のファンクションで、copy toでencodingをsjis指定すると、tomcat経由でもsjisで出力されるのは確認しました。どこの設定でtomcatからのcopy toがデフォルトがUTF8になっているのでしょうか?データベースとの接続はJDBC接続でデータソースを使用しています。 どなたか教えていただけないでしょうか。宜しくお願いします。

  • DOSコマンド(COPYコマンド)について

    DOS上でのCOPYコマンドについて確認します。 EXCELのファイルで、毎回ファイル名が変わるため、COPYコマンドで固定のファイル名にしようと思い、バッチ起動で、COPY \AAA\*.XLS \AAA\BBB.XLSで実行すると、コピー元と違うファイルサイズのBBB.XLSが作成されます。 中身を参照すると、文字化けしたものが 1レコードだけ作成されています。どうしてなのでしょうか? ※コピー元の*.XLSは、毎回 1ファイルのみです。

  • ファイルアップロードによるPostgreSQLのデータ更新について

    OSはRedhat7.2、webサーバとしてはapache1.3.26を使用しています。 現在PHP4とPostgreSQLを使用してのwebアプリを構築中ですが、データベースへのレコード追加のことで質問があります。 テキストファイルをアップロードしデータベースに流し込むという処理をPHPから行いたいのです。 PostgreSQLに用意されているCOPYコマンドを使おうと思っていたのですがどうやらこれはPHPからは使えないらしいのです。このコマンドはPostgreSQLのスーパーユーザのみ実効可能とのことですが、DB接続時のユーザをスーパーユーザにしてもだめでした。 現在は、 echo \\\copy テーブル名 from '/tmp/$uploadfile_name' | /usr/local/pgsql/bin/psql データベース名 という文をシステム関数を使用して流すことにより処理していますが、これだとwebサーバとデータベースサーバが同じマシンじゃないとだめです。 データベースサーバとwebサーバを別のマシンにして同じような処理をするには、テキストファイルの中身を1行ずつ変数に格納して、1行ずつinsert文を発行していくしかないのでしょうか?また、この方法だと処理時間はかなりかかるのでしょうか?ちなみにテキストデータの中身は大体200行前後で一番多いときで1000行ほどです。フィールド数は70ほどです。どなたかよい方法があれば教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • コマンドプロンプトでのcopyコマンド

    Windowsのコマンドプロンプトでのcopyコマンドで困っています。  フォルダ内に次のテキストファイル群があり、これを1つのファイルに結合したいです。    0201.log    0202.log    0203.log      :      :    0229.log と日付.logがある。  プロンプトから    copy 02*.log feb.log とすると結合してはくれるのですが、順番が前後する場合があります。  0201の次に0210がきて0211,0212,..0219,0202,0203といった感じです。  コマンドプロンプトからdirでファイル名を表示させると、確かに結合される順番と合って いる様子。  この順番を変えてやればいいのかと思いますが、やり方がわかりません。  もちろん    copy 0201.log + 0202.log + 0203.log + .... とやる方法や、全テキストデータをnotepad等で開いて地道に結合する方法もあるのでしょうが、 効率悪すぎます。  0201,0202,0203...と順番通りに結合する方法がありましたら、教えてください。  なお、type 02*.log >> feb.logでも望む結果は得られませんでした。