我正在尝试将CSV数据导入表中。问题在于,即使使用了CSV HEADER
,CSV仍然是根据列索引而不是该列的标题进行导入的。
CREATE TABLE denominations (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
CREATE TABLE churches (
id SERIAL PRIMARY KEY,
-- NOT relevant here
address_id INTEGER REFERENCES addresses,
denomination_id INTEGER NOT NULL REFERENCES denominations,
name VARCHAR(100) NOT NULL
);
我的CSV文件看起来像:
id,name
1,Southern Baptist Convention
2,Nondenominational
3,Catholic
4,Presbyterian
id,denomination_id,name,address_id
1,1,Saddleback Church,
2,4,First Presbyterian Church,
3,3,St. Elizabeth's Church,
4,3,St Monica Catholic Community,
5,2,Modern Day Saints Church,
6,4,Second Presbyterian Church,
我的bash中复制命令看起来像这样:
psql -d vacation -c "COPY denominations FROM '$PWD/data/Data - Denominations.csv' WITH DELIMITER ',' CSV HEADER;"
psql -d vacation -c "COPY churches FROM '$PWD/data/Data - Churches.csv' WITH DELIMITER ',' CSV HEADER;"
我得到的错误是:
ERROR: invalid input syntax for integer: "Saddleback Church"
CONTEXT: COPY churches, line 2, column denomination_id: "Saddleback Church"
目前,我将重新排列CSV中的列,但这样行得通吗?
COPY
命令中即可。在任何体面的语言中或甚至手动操作都很容易。 - Patrick\n
以获取标题行,然后将该值粘贴到COPY
命令中。例如使用head -n 1 _filename_
. - PatrickCOPY
命令还有很大的改进空间,自动识别表头会更好。据我所知,目前没有人在开发它。需要进行更高级操作的大多数人使用 ETL 工具。 - Craig Ringer