gpt4 book ai didi

sql - Postgres : best solution to ignore errors during bulk insert

转载 作者:行者123 更新时间:2023-11-29 12:19:25 24 4
gpt4 key购买 nike

我在这里看到了很多类似的问题。但我想我的问题是具体的。

这是我为当前版本的 Postgres (9.4) 找到的最佳解决方案: http://www.depesz.com/2012/06/10/why-is-upsert-so-complicated/ http://www.postgresql.org/docs/current/static/plpgsql-control-structures.html#PLPGSQL-UPSERT-EXAMPLE

通常,建议的解决方案基于算法:插入一行,如果发生错误 - 做某事,如果没有 - 插入下一行。

如果我只需要忽略重复错误,我可以这样做吗?

INSERT INTO tablename (id,name,surname) values (1,'john','doe')
INSERT INTO tablename (id,name,surname) values (2,'jane','smith')

而不是这个:

INSERT INTO tablename (id,name,surname) values (1,'john','doe'),(2,'jane','smith')

...如果我必须一次只插入 ~5-30 行?因此,一些插入的行只是返回重复的错误,但其余的将成功执行。实际上,这就是我所需要的。

我尝试通过 EXPLAIN INSERT 一次 100 行和分别 100 行来比较这些方法的成本。可能是我做错了什么,因为当我单独插入行时,它显示执行时间减少了约 25-50 倍,如第一个示例:

INSERT INTO tablename (id,name,surname) values (1,'john','doe')
INSERT INTO tablename (id,name,surname) values (2,'jane','smith')

这是我使用的查询包装器:

BEGIN;
EXPLAIN ANALYZE
-- query or queriES here
ROLLBACK;

所以,问题是,为什么我会收到这个?可能是,EXPLAIN 显示每一行而不是整个查询的执行时间?那么这是有道理的:在这种情况下,批量插入的成本将比单独的命令低约 3 倍。对吧?

最佳答案

with i (id, name, surname) as (values (1,'john','doe'),(2,'jane','smith'))
insert into t (id, name, surname)
select id, name, surname
from i
where not exists (
select 1
from t
where id = i.id and name = i.name and surname = i.surname
)

如果可以以任何其他方式插入数据,则存在上述竞争条件。如果发生错误,请重试。

关于sql - Postgres : best solution to ignore errors during bulk insert,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34489106/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com