在 Postgres 9.2 中运行 Copy 后,单引号显示四舍五入的值



我是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
 );

我准备了以下数据文件(天气.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避免单引号换行?

你在问题中描述的显然不是真正发生的事情。 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 代码。

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 命令中可以使用许多不同的开关

最新更新