Fir*_*ock 3 sql postgresql insert bulk duplicate-removal
我有没有ID的产品清单(300万件) - 只有标题.但我不知道DB中已存在哪些标题.必须在DB中添加新产品(约290万件).之后,我必须知道每种产品(新的和现有的)的ID.
在PostgreSQL中有最快的方法吗?我可以根据需要更改数据库(添加默认值,添加列等).
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应该自动与一个来生成serial列tbl_id在tbl.
该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:
SELECT tbl.tbl_id, tbl.title
FROM tbl
JOIN tmp USING (title)
Run Code Online (Sandbox Code Playgroud)
在同一个会议!会话结束时会自动删除临时表.
| 归档时间: |
|
| 查看次数: |
1686 次 |
| 最近记录: |