如何在PostreSQL中只批量插入新行
我有一个产品清单(300万件)没有ID-只有标题。但我不知道DB中已经存在哪些标题。必须向DB中添加新产品(约290万项)。之后,我必须知道每个产品的ID(新的和现有的) 在PostgreSQL中有最快的方法吗?我可以根据需要更改数据库(添加默认值、添加列等)。导入数据 将所有内容添加到临时暂存表中,并仅将新标题插入目标表中如何在PostreSQL中只批量插入新行,sql,postgresql,insert,duplicate-removal,bulk,Sql,Postgresql,Insert,Duplicate Removal,Bulk,我有一个产品清单(300万件)没有ID-只有标题。但我不知道DB中已经存在哪些标题。必须向DB中添加新产品(约290万项)。之后,我必须知道每个产品的ID(新的和现有的) 在PostgreSQL中有最快的方法吗?我可以根据需要更改数据库(添加默认值、添加列等)。导入数据 将所有内容添加到临时暂存表中,并仅将新标题插入目标表中 CREATE TEMP TABLE tmp(title text); COPY tmp FROM 'path/to/file.csv'; ANALYZE tmp; IN
CREATE TEMP TABLE tmp(title text);
COPY tmp FROM 'path/to/file.csv';
ANALYZE tmp;
INSERT INTO tbl
SELECT DISTINCT tmp.title
FROM tmp
LEFT JOIN tbl USING (title)
WHERE tbl.title IS NULL;
id应自动生成,并在tbl
中使用列tbl\u id
左连接
/为空
构造取消现有标题的资格<代码>不存在将是另一种可能性
DISTINCT
防止临时表中的传入数据重复tmp
用于确保查询计划器选择合理的计划,并且autovacuum不会分析临时表
由于您有300万个项目,因此提高temp\u buffer
的设置可能需要付出代价(仅适用于此会话):
或者,无论您能负担多少,并且足以将临时表保存在RAM中,这都要快得多。注意:必须在会话中首先完成-在创建任何临时对象之前
检索ID
要查看导入数据的所有ID,请执行以下操作:
SELECT tbl.tbl_id, tbl.title
FROM tbl
JOIN tmp USING (title)
在同一个环节!会话结束时会自动删除临时表
SELECT tbl.tbl_id, tbl.title
FROM tbl
JOIN tmp USING (title)