如何批量插入PostgreSQL中的新行

时间:2013-04-05 12:56:55

标签: sql postgresql insert duplicate-removal bulk

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

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

1 个答案:

答案 0 :(得分:5)

导入数据

COPY 临时登台表的所有内容,并仅将新标题插入目标表。

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;

应使用tbl_id中的serialtbl自动生成ID。

LEFT JOIN / IS NULL构造取消现有标题的资格。 NOT EXISTS将是另一种可能性。

DISTINCT可防止临时表tmp中的传入数据出现重复。

ANALYZE有助于确保查询计划程序选择合理的计划,并且autovacuum不会分析临时表。

由于您有300万件商品,因此提高temp_buffer的设置(此会话的)可能需要付费:

SET temp_buffers = 1000MB;

或者你可以承受多少钱并且足以将临时表保存在RAM中,这要快得多。注意:必须在会话中 first - 在创建任何临时对象之前完成。

检索ID

查看导入数据的所有ID:

SELECT tbl.tbl_id, tbl.title
FROM   tbl
JOIN   tmp USING (title)

在同一个会话中!会话结束时会自动删除临时表。