我是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');
我想知道:
- 用单引号将文本值换行的原因是什么?
- 将文本数据放入使用的文件中的正确方法是什么
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 命令中可以使用许多不同的开关