Postgres导入CSV时如何忽略bigserial类型的id列
问题原因
COPY 命令默认会匹配目标表的全量字段顺序读取输入数据,你的CSV没有包含id字段,且你没有指定要导入的字段范围,因此PostgreSQL会判定输入数据缺失id列内容报错。
解决方案
方案1:明确指定导入的字段列表(最简便)
直接在COPY语句的表名后补充你的CSV中实际包含的字段名(顺序要和CSV表头的顺序完全一致),PostgreSQL会自动为bigserial类型的id字段生成自增值,不需要手动传入。
把你原来的命令中的COPY部分修改为如下格式即可:
COPY mytable (你CSV里的列名1, 你CSV里的列名2, 你CSV里的列名3) FROM STDIN DELIMITER ',' CSV HEADER;
修改后的完整命令示例:
type "..\MyCSVtoImport.csv" | "..\psql.exe" -h MyServerPostgres -p 5432 -U "MyUser" -c " COPY mytable (col1, col2, create_time) FROM STDIN DELIMITER ',' CSV HEADER; " MyBase
注意:括号内的列名请替换为你CSV表头里的实际列名,顺序和CSV表头顺序保持完全一致
方案2:通过临时表中转(适合列数多、不想逐个写列名的场景)
如果你要导入的列太多,手动写列名太麻烦,可以先把CSV导入到和CSV结构完全一致的临时表,再从临时表写入目标表:
- 先创建和CSV字段完全匹配的临时表:
CREATE TEMP TABLE temp_csv_import AS SELECT 你CSV里的列名1, 你CSV里的列名2, 你CSV里的列名3 FROM mytable LIMIT 0;
- 执行导入到临时表:
type "..\MyCSVtoImport.csv" | "..\psql.exe" -h MyServerPostgres -p 5432 -U "MyUser" -c " COPY temp_csv_import FROM STDIN DELIMITER ',' CSV HEADER; " MyBase
- 把临时表数据插入到目标表,id字段会自动生成:
INSERT INTO mytable (你CSV里的列名1, 你CSV里的列名2, 你CSV里的列名3) SELECT * FROM temp_csv_import;
内容的提问来源于stack exchange,提问作者SebP
相关产品推荐
相关产品推荐

