PostgreSQL:创建一个.sql文件,以最快的方式将数据插入表中

时间:2012-02-10 14:50:44

标签: database postgresql insertion postgresql-9.1

我正在开发一个项目,我必须解析一堆.csv文件,所有不同的格式,并通过一些C ++函数包含不同类型的数据。之后,我从文件中提取数据并创建一个.sql文件,该文件可以在psql中导入,以便在稍后阶段将数据插入PostgreSQL数据库。

但是我无法弄清楚.sql文件的正确语法。这是一个示例表和一个示例.sql文件,它重现了我得到的相同错误:

表格创建代码:

CREATE TABLE "Sample_Table"
(
  "Col_ID" integer NOT NULL,
  "Col_Message" character varying(50),
  CONSTRAINT "Sample_Table_pkey" PRIMARY KEY ("Col_ID" )
)

insertion.sql(在复制行之后,由单个制表符分隔的字段)

copy Sample_Table (Col_ID, Col_Message) from stdin;
1   This is Spaaarta
2   Why So Serious
3   Baazinga
\.

现在如果我执行上面的sql文件,我会收到以下错误:

ERROR:  syntax error at or near "1"
LINE 2: 1 This is Spaaarta
        ^


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

如果它可以提供帮助,我正在运行PostgreSQL 9.1版本,所有上述查询都是通过PGAdmin III软件执行的。

2 个答案:

答案 0 :(得分:1)

要检查的三件事:

  • 列之间实际上只有一个制表符吗?空间是禁区。

  • 是否有更多错误消息?我错过至少一个。 (见下文)

  • 当您强制区分大小写的表和列名称时,必须执行此操作。因此,您必须写下:

copy "Sample_Table" ("Col_ID", "Col_Message") from stdin;

否则你会得到theese错误:

psql:x.sql:1: ERROR:  relation "sample_table" does not exist
psql:x.sql:5: invalid command \.
psql:x.sql:5: ERROR:  syntax error at or near "1"
LINE 1: 1 This is Spaaarta
        ^

有了这些东西,我就可以成功使用你的示例数据了。

编辑错误更改:提问者现在有

ERROR: invalid input syntax for integer: "1 'This is Spaaarta'"

1的某些内容不合适。

我的猜测是,这是一个编码问题。带有UTF-16的Windows可能是这里的罪魁祸首。

调试其他网络上的这类问题并不容易,因为许多半智能程序都在线上,大多数都喜欢调整“少数”的东西。

但首先检查psql中的一些内容:

\encoding
show client_encoding;
show server_encoding;

根据pastebin数据,它们应该是相同的,并且是“SQL_ASCII”,“LATIN1”或“UTF-8”之一。

如果它们已经存在或调整它们没有帮助:Unix / Linux / cygwin有一个hexdump -C x.sql程序,将其输出发布到pastebin。不要使用任何Windows编辑器(如ultraedit)中的hexdump - 他们已经多次骗过我。将文件传输到Linux时,请务必使用二进制传输。

答案 1 :(得分:1)

PgAdmin不支持以与psql相同的方式执行COPY命令(或者至少,它不是我最后一次尝试使用版本1.14时)。使用psql执行脚本,或使用INSERT语句。