在postgres 9.2中运行副本后,单引号显示为arround值

时间:2013-01-29 09:19:45

标签: sql postgresql postgresql-9.2

我是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以避免单引号包装?

2 个答案:

答案 0 :(得分: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

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

保留字作为标识符

我看到你复制了手册中的例子。这是temporary table

虽然正确,但手册中的那个例子很不幸。我建议不要使用deep link to the current manual作为列名。正如您所看到的,reserved words like date {{1}}是每个SQL标准中的保留字。它允许在Postgres中使用,我可以看到它是如何诱惑一个简单的例子。但这并不是一个好主意。通常,您应该养成避免保留字作为标识符的习惯。它会导致令人困惑的错误消息和不必要的不​​兼容的SQL代码。

答案 1 :(得分:0)

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

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