2016-04-02 19 views
3

簡単な例データベースにPostgresの9.5.1にSQL経由COPYコマンドを使用しようとし...PG COPYエラー:「整数のための無効な入力構文」は任意の整数ずに引用されたCSVファイルをインポートするとき

私はこれを取得していますエラー:

ERROR: invalid input syntax for integer: "Sally" 
CONTEXT: COPY customer_, line 2, column id_: "Sally" 

********** Error ********** 

ERROR: invalid input syntax for integer: "Sally" 
SQL state: 22P02 
Context: COPY customer_, line 2, column id_: "Sally" 

... CSV(コンマ区切り値)でこのデータをインポート:

"first_name_","last_name_","phone_","email_" 
"Sally","Jones","425.555.1324","[email protected]" 
"Jarrod","Barkley","206.555.3454","[email protected]" 
"Wendy","Melvin","415.555.2343","[email protected]" 
"Lisa","Coleman","425.555.7282","[email protected]" 
"Jesse","Johnson","507.555.7865","[email protected]" 
"Jean-Luc","Martin","212.555.2244","[email protected]" 

は... pgAdminでで実行される次のSQLを介してインポートされる:

このテーブルへ
COPY customer_ 
FROM '/home/parallels/Downloads/customer_.csv' 
CSV 
HEADER 
; 

...:

-- Table: public.customer_ 

-- DROP TABLE public.customer_; 

CREATE TABLE public.customer_ 
(
    id_ integer NOT NULL DEFAULT nextval('customer__id__seq'::regclass), 
    first_name_ text NOT NULL, 
    last_name_ text NOT NULL, 
    phone_ text NOT NULL DEFAULT ''::text, 
    email_ text NOT NULL DEFAULT ''::text, 
    CONSTRAINT pkey_customer_ PRIMARY KEY (id_) 
) 
WITH (
    OIDS=FALSE 
); 
ALTER TABLE public.customer_ 
    OWNER TO postgres; 
COMMENT ON TABLE public.customer_ 
    IS 'Represents a person whose pets visit our clinic.'; 

は、だから、列の名前を含む最初の行が正常に処理されているようです。障害ポイントは、CSVの第1のデータラインの第1のデータ値である。私のインポートされたデータは整数型ではないので、私はエラーメッセージで悩まされています。唯一の整数はid_主キーで、自動インクリメントSERIALです。

私はPG COPY error: invalid input syntax for integerの質問ページを読んだ。しかし、この質問には整数値が含まれていました。空の引用符付き文字列にはNULLが含まれていませんでした。私の場合、ここではデータに整数値はありません。唯一の整数は、の生成値を持つ主キーSERIAL列です(インポートされるデータには含まれません)。

また、質問、PostgreSQL ERROR: invalid input syntax for integerが見つかりました。しかし、それは無関係なようです。

答えて

6

列を指定してみてください。 。 。主キーなし:

COPY customer_ (first_name_ text, last_name_ text, phone_ text, email_ text) 
FROM '/home/parallels/Downloads/customer_.csv' 
CSV 
HEADER 
; 

列リストがなければ、それはid_の値を探しています。

インポートデータファイルの最初の列名の列は、ではなく、がテーブルの列にマッピングされます。

HEADER

Specifies that… on input, the first line is ignored. …

+0

指定しないために 'HEADER'の全体のポイントではない:ヘッダフラグは、単に最初の行、as documentedがいることをスキップするのPostgresに指示しますか?とにかく、私はあなたの提案を試みました(しかし、 'テキスト'の言葉を省略)。まだまだ不思議な違いがありますが、これまでに問題になっていた行を処理したような謎があります。私は '/home/parallels/Downloads/customer_.csv' CSV HEADER FROM 'COPYのcustomer_(first_name_、last_name_、phone_、email_) を実行しました;'と 'ERRORエラーを得た:カラムの欠落したデータ "last_name_" CONTEXT :COPYのcustomer_、8行目: "" ********** **********エラー ERROR:列のデータ欠落している "last_name_" SQL状態:22P04 コンテキスト:COPY customer_、line 8: "" ' –

+0

最後のエラーは、CSVデータファイルの末尾**に空白行があることが判明しました。 PostgresはそのCSVには気をつけています。したがって、この回答は成功した回避策です。しかし、私はまだ列名の綴りが必要な場合は、 'COPY'コマンドで' HEADER'のポイントを理解していません。 –

+1

[COPYのdoc](http://www.postgresql.org/docs/current/static/sql-copy)を詳しく読んでください。html)は、ファイルの読み込み時に列名が無視されることを示しています。 'HEADER'フラグは単にPostgresにその最初の行をスキップするように指示します(エクスポート時にPostgresにその最初の行を生成するよう指示します)。したがって、この回答に示されているように列名を指定することは、バグではなく機能として必要となります。 –

関連する問題