0

我是 postgres 的新手,我在玩数据加载。这是 postgres 9.2 规范中的表定义:

CREATE TABLE weather (
    city varchar(80),
    temp_lo int, -- low temperature
    temp_hi int, -- high temperature
    prcp real, -- precipitation
    date date
 );

我准备了以下数据文件(weather.txt):

San Francisco   43  57  0.0 '1994-11-29'
Hayward 54  37  0.0 '1994-11-29'

并运行 COPY 命令:

COPY weather FROM '~aviad/postsgres/playground/weather.txt';

现在,当我跑步时,select * from weather;我看到城市值周围出现单引号。当我运行简单时,这不会发生,INSERT例如:

INSERT INTO weather VALUES ('San Francisco', 46, 50, 0.25, '1994-11-27');

我想知道:

  1. 用单引号包裹文本值的原因是什么?
  2. 将文本数据放入用于 COPY避免单引号换行的文件中的正确方法是什么?
4

2 回答 2

2

您在问题中描述的显然不是真正发生的事情。COPY尝试将带有冗余单引号的字符串文字导入date列中会失败。

要摆脱多余的引号,请导入带有列的临时表text,然后INSERT INTO修剪引号的目标表:

CREATE TEMP TABLE wtmp (
   city text
 , temp_lo int
 , temp_hi int
 , prcp real
 , date text  -- note how I use text here.
);

COPY wtmp FROM '~aviad/postsgres/playground/weather.txt';

INSERT INTO weather (city, temp_lo, temp_hi, prcp, date)
SELECT city, temp_lo, temp_hi, prcp, trim(date, '''')::date
FROM   wtmp
-- ORDER BY ?
;

临时表会在会话结束时自动删除。

保留字作为标识符

我看到您从手册中复制了示例。这是当前手册的深层链接

虽然是正确的,但手册中的那个例子是不幸的。我建议不要使用保留字,date如列名。如您所见,这 date是每个 SQL 标准中的保留字。它被允许在 Postgres 中使用,我可以看到一个简单的例子是多么诱人。但这并不是一个好主意。通常,您应该养成避免保留字作为标识符的习惯。它会导致混乱的错误消息和不必要的不​​兼容 SQL 代码。

于 2013-01-29T12:02:52.297 回答
0

1 - 如果文件中使用的分隔符(在您的情况下为逗号)也出现在文本字符串中,则使用带引号的标识符包装文本的做法是

2 - 我不知道 postgres,但如果你在 COPY 命令中指定带引号的标识符,它应该在导入期间将其删除:

COPY weather FROM '~aviad/postsgres/playground/weather.txt' (QUOTE '?');

类似的东西。只需尝试更换 ? 使用带引号的标识符-在您的情况下,我将首先尝试:

COPY weather FROM '~aviad/postsgres/playground/weather.txt' (QUOTE '''');

您可能还想查看:http ://www.postgresql.org/docs/9.2/static/sql-copy.html ,因为您可以在 COPY 命令中使用许多不同的开关

于 2013-01-29T09:31:01.367 回答