web-dev-qa-db-ja.com

psql \ copyメタコマンドでエラーを無視する方法

PostgreSQLデータベースと次のpsqlコマンドでcopyを使用しています:

\COPY isa (np1, np2, sentence) FROM 'c:\Downloads\isa.txt' WITH DELIMITER '|'

私は得ます:

ERROR:  extra data after last expected column

エラーのある行をスキップするにはどうすればよいですか?

8
Superdooperhero

Postgres 9.5までのコマンド全体をスキップせずにエラーをスキップすることはできません。現在、洗練されたエラー処理はありません。

\copy はSQLの単なるラッパーです COPY 結果をpsql経由でチャネル化します。 COPYのマニュアル:

COPYは最初のエラーで操作を停止します。これはCOPY TOのイベントで問題を引き起こすことはありませんが、ターゲットテーブルは、COPY FROMの以前の行を既に受け取っています。これらの行は表示またはアクセスできませんが、ディスク領域を占有します。大規模なコピー操作で障害が発生した場合、これはかなりの量の無駄なディスク領域になる可能性があります。 VACUUMを呼び出して、無駄なスペースを回復することができます。

大胆な強調鉱山。そして:

COPY FROMは、入力ファイルのいずれかの行に予想よりも多いまたは少ない列が含まれている場合にエラーを発生させます。

Postgres 9.0ではCOPYにエラーログを追加する試み がありましたが、Aster Dataが先頭に立っていましたが、コミットされていませんでした。この会社は後にTeradataに買収されたので、彼らがまだプロジェクトを進めているとは思えません。

解決

代わりに入力ファイルを修正してください。

入力ファイルに1つ以上の追加の列があり、ファイルがその他の整合性がある場合、テーブルにダミー列を追加することができますisaおよびそれらを後でドロップします。または(本番テーブルではよりクリーン)一時ステージングテーブルにインポートし、そこからターゲットテーブルINSERTisa選択した列(または式)をインポートします。

詳細な手順と関連する回答:

12