将 CSV 导入到 postgreSQL 中的表中,忽略重复项 - 亚马逊 AWS/RDS

Posted

技术标签:

【中文标题】将 CSV 导入到 postgreSQL 中的表中,忽略重复项 - 亚马逊 AWS/RDS【英文标题】:Import CSV to table in postgreSQL ignoring duplicates - Amazon AWS/RDS 【发布时间】:2021-10-24 04:11:41 【问题描述】:

我有一个托管在 AWS (RDS) 上的 PostgreSQL。我创建了几个表,并使用 PgAdmin4 上的“导入/导出”工具将一些 .csv 文件导入到这些表中。

我需要每月更新表中的数据,我会通过上传 .csv 文件来完成。

我现在面临的问题是:我正在尝试从 .csv 文件在表中插入新数据,但我需要忽略重复值

我找到了一种方法来做到这一点here(下面的代码)但是copy 命令在 PgAdmin 上不起作用。仅当我使用导入/导出工具时,复制才有效。

CREATE TEMP TABLE tmp_table 
ON COMMIT DROP
AS
SELECT * 
FROM indice-id-cnpj
WITH NO DATA;

COPY tmp_table FROM 'C:/Users/Win10/Desktop/Dados/ID-CNPJ.csv';

INSERT INTO indice-id-cnpj
SELECT *
FROM tmp_table
ON CONFLICT DO NOTHING

这是我对 PostgreSQL 的第一次体验(除了 uni 中的一个主题)。我可以通过使用 excel 并做一些手动工作来解决这个问题,但我正在寻找一个“长期”解决方案,关于如何使用 .csv 文件不断更新表格,始终忽略重复项。

提前致谢。

【问题讨论】:

不要使用 pgAdmin 使用 psql 代替。这是一个更好的启动体验。 应该添加,如果你使用psql,你将需要使用\copy 【参考方案1】:

所以,我找到了解决方案。

正如 Adrian 所说,我必须使用 psql。

CREATE TEMP TABLE tmp_table AS SELECT * FROM table-name WITH NO DATA;
\copy tmp_table FROM 'C:/Users/Win10/folder/filename.csv' DELIMITER ',' CSV ENCODING 'UTF8' ;


INSERT INTO "table-name" SELECT * FROM tmp_table ON CONFLICT DO NOTHING;
DROP TABLE tmp_table;

由于我使用的是 psql,因此有必要使用命令 \copy 而不是 COPY。此外,每个命令都必须以“;”结尾并且有必要在最后删除tmp_table

【讨论】:

以上是关于将 CSV 导入到 postgreSQL 中的表中,忽略重复项 - 亚马逊 AWS/RDS的主要内容,如果未能解决你的问题,请参考以下文章

使用 NodeJs 将数据从 CSV 导入 Oracle 中的表

如何在不先定义表中的列的情况下将数据加载到 PostgreSQL 中?

将 CSV 文件中的内容加载到 PostgreSQL 表中

如何在 sqlite3 中正确导入和配置 .csv 表

如何避免PostgreSQL中表的OID列?

CSV 文件数据到 PostgreSQL 表中