如何批量插入PostreSQL中的新行

Fir*_*ock 3 sql postgresql insert bulk duplicate-removal

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

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

Erw*_*ter 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;
Run Code Online (Sandbox Code Playgroud)

ID应该自动与一个来生成serialtbl_idtbl.

LEFT JOIN/ IS NULL结构不够格已有的标题.NOT EXISTS将是另一种可能性.

DISTINCT防止临时表中传入数据的重复tmp.

ANALYZE 有用的是确保查询规划器选择合理的计划,并且autovacuum不会分析临时表.

由于您有300万个项目,因此可能需要提高temp_buffer(仅适用于此会话)的设置:

SET temp_buffers = 1000MB;
Run Code Online (Sandbox Code Playgroud)

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

检索ID

要查看导入数据的所有ID:

SELECT tbl.tbl_id, tbl.title
FROM   tbl
JOIN   tmp USING (title)
Run Code Online (Sandbox Code Playgroud)

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