我是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');
我想知道:
COPY
以避免单引号包装?答案 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命令中使用许多不同的开关