Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PostreSQL中只批量插入新行_Sql_Postgresql_Insert_Duplicate Removal_Bulk - Fatal编程技术网

如何在PostreSQL中只批量插入新行

如何在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

我有一个产品清单(300万件)没有ID-只有标题。但我不知道DB中已经存在哪些标题。必须向DB中添加新产品(约290万项)。之后,我必须知道每个产品的ID(新的和现有的)

在PostgreSQL中有最快的方法吗?我可以根据需要更改数据库(添加默认值、添加列等)。

导入数据 将所有内容添加到临时暂存表中,并仅将新标题插入目标表中

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)