正确的COPY命令从csv文件加载具有单引号数据的postgreSQL数据?

nul*_*ull 15 sql csv postgresql copy quote

我有csv文件,其内容如下:

10,53073,0,0,'Y','2008-05-30 21:46:55',0,'2008-05-30 21:48:04',0,53071,2
Run Code Online (Sandbox Code Playgroud)

我想将csv数据加载到my_table中.

CREATE TABLE my_table
(
  ad_tree_id numeric(10,0) NOT NULL,
  node_id numeric(10,0) NOT NULL,
  ad_client_id numeric(10,0) NOT NULL,
  ad_org_id numeric(10,0) NOT NULL,
  isactive character(1) NOT NULL DEFAULT 'Y'::bpchar,
  created timestamp without time zone NOT NULL DEFAULT now(),
  createdby numeric(10,0) NOT NULL,
  updated timestamp without time zone NOT NULL DEFAULT now(),
  updatedby numeric(10,0) NOT NULL,
  parent_id numeric(10,0),
  seqno numeric(10,0),
  CONSTRAINT ad_treenodemm_pkey PRIMARY KEY (ad_tree_id , node_id ),
  CONSTRAINT adtree_adtreenodemm FOREIGN KEY (ad_tree_id)
      REFERENCES ad_tree (ad_tree_id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
  CONSTRAINT ad_treenodemm_isactive_check CHECK (isactive = ANY (ARRAY['Y'::bpchar, 'N'::bpchar]))
)
Run Code Online (Sandbox Code Playgroud)

当我在pgAdmin III工具中运行此命令时:

COPY my_table FROM 'c:\downloads\file.csv' DELIMITERS ',' CSV;
Run Code Online (Sandbox Code Playgroud)

我收到了错误:

ERROR:  value too long for type character(1)
CONTEXT:  COPY my_table, line 1, column isactive: "'Y'"
Run Code Online (Sandbox Code Playgroud)

然后我修改了这样的命令:

COPY my_table FROM 'c:\downloads\file.csv' DELIMITERS ',' CSV QUOTE ''';
COPY my_table FROM 'c:\downloads\file.csv' DELIMITERS ',' CSV QUOTE '\'';
COPY my_table FROM 'c:\downloads\file.csv' DELIMITERS ',' CSV QUOTE '\'' ESCAPE '\';
COPY my_table FROM 'c:\downloads\file.csv' DELIMITERS ',' CSV QUOTE '\'' ESCAPE \;
Run Code Online (Sandbox Code Playgroud)

尝试时都失败了.

那么,任何人都可以告诉我这个案例的正确COPY命令?

Cra*_*ger 31

双单引号(如果standard_conforming_strings已启用,请参阅文档)

COPY my_table FROM 'c:\downloads\file.csv' DELIMITERS ',' CSV QUOTE '''';
Run Code Online (Sandbox Code Playgroud)

或使用非标准PostgreSQL特定的转义字符串:

COPY my_table FROM 'c:\downloads\file.csv' DELIMITERS ',' CSV QUOTE E'\'';
Run Code Online (Sandbox Code Playgroud)

  • 如果COPY是为admin用户保留的,则从psql命令行使用,\ COPY my_table FROM'c:\ downloads\file.csv'DELIMITERS','CSV QUOTE'''; (2认同)

小智 5

其他一些遇到此错误的人可能想要检查文件以查看它的第一行是否包含标题。虽然这不是您的情况的问题,但值得注意的是解决它的方法:

COPY my_table FROM 'c:\downloads\file.csv' WITH DELIMITER ',' CSV HEADER;
Run Code Online (Sandbox Code Playgroud)