作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有没有 ID 的产品列表(300 万件)——只有标题。但我不知道数据库中已经存在哪些标题。必须将新产品(约 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;
ID 应使用 serial
自动生成tbl
中的 tbl_id
列。
LEFT JOIN
/IS NULL
构造取消了现有标题的资格。 NOT EXISTS
是另一种可能性。
DISTINCT
防止临时表 tmp
中的传入数据重复。
ANALYZE
有助于确保查询规划器选择一个合理的计划,并且 autovacuum 不会分析临时表。
由于您有 300 万个项目,提高 temp_buffer
的设置可能是值得的(仅针对此 session ):
SET temp_buffers = 1000MB;
或者无论您负担得起多少,都足以将临时表保存在 RAM 中,这样速度要快得多。注意:必须在 session 中首先完成 - 在创建任何临时对象之前。
查看导入数据的所有 ID:
SELECT tbl.tbl_id, tbl.title
FROM tbl
JOIN tmp USING (title)
在同一个 session 中! session 结束时会自动删除一个临时表。
关于sql - 如何在 PostgreSQL 中批量插入新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15834569/
我是一名优秀的程序员,十分优秀!