当前位置: 首页 > 知识库问答 >
问题:

在PostgreSQL中,我在1000行上执行UPSERT,在冲突中使用。。。什么都不做,如果一行失败,是否插入其他999行?

公良天逸
2023-03-14

我在努力理解关于冲突的条款是如何运作的。我想要的是,如果插入由于任何原因失败,我希望它不处理行,而是继续处理批量插入中的其他项。

以下是我的设想。我正在构建一个批量插入查询,需要插入1000行。目前,我的查询有:

INSERT INTO table (...,...,...) 
VALUES (...,...,...),(...,null..,...), (998 more) 
ON CONFLICT ON CONSTRAINT primary_key DO NOTHING

我想知道的是我能做到这一点:

INSERT INTO table (...,...,...) VALUES (...,...,...),(...,null..,...), (998 more) 
ON CONFLICT DO NOTHING

这将有效地解决插入行(在我的例子中是列上的null约束)和不插入行之间的任何冲突。我需要确保,如果一行有1个冲突,其他999行仍将被插入。

更新:这里有一个演示,显示了我遇到的问题:https://dbfiddle.uk/?rdbms=postgres_9.5

更新2:看起来,当您传递空值时,整个批量插入过程都失败了。

最终更新:接受第一个答案是因为那个很酷的演示链接——这帮助我意识到(在评论中)null没有被捕获,所以我只需要改变我的表结构并依赖主键...所以当添加重复的空值时,pkey约束会被触发。谢谢大家!

共有1个答案

阴培
2023-03-14

所有没有冲突的行都将被插入,冲突的行将被忽略。

考虑这个演示:

-- create the table and insert a record with id 1
create table t (id int primary key, info text);
insert into t values (1, 'old');
-- 1 rows affected

-- attempt to insert 5 'new' records with ids 1 .. 5
insert into t 
select n, 'new' from generate_series(1, 5) as n(n) on conflict do nothing;
-- 4 rows affected

-- check the results
select * from t;
id | info
-: | :---
 1 | old 
 2 | new 
 3 | new 
 4 | new 
 5 | new 
 类似资料:
  • 假设我有下表: 我需要一个查询,将插入不存在的标签,并返回所有请求的标签ID。考虑以下事项: 此查询的输出是: 我需要的是在输出中有。

  • 错误:任务“:app:PreDebugandroidTestBuild”执行失败。 与项目':app'中的依赖项'com.android.support:support-annotations'冲突。应用程序(26.1.0)和测试应用程序(27.1.1)的解析版本不同。有关详细信息,请参见https://d.android.com/r/tools/test-apk-dependency-confl

  • 我看过几篇关于这个主题的帖子(post1,post2,post3)。在所有这些问题中,解决方案看起来都很容易,但我无法得到返回值的值。 这是我到目前为止所尝试的: 备选办法1: 备选案文3: 结果:原因,如果还注意到 创建到Java代码中的查询如下所示: 和连接字符串:

  • 在PostgreSQL 9.5中出现了冲突更新/无操作功能。创建服务器和外部表将在PostgreSQL 9.2版本中出现。 当我对外部表使用ON CONFLICT DO UPDATE时,它不起作用,但当我对普通表运行相同的查询时,它起作用。下面给出了问题。 //对于普通表 O/P:查询成功返回:一行受影响,执行时间为5毫秒。 //对于外部表概念 //foreign_app为foreign tabl

  • 问题内容: 如果条目不存在,我想将数据插入多个表中。 就我而言,我有一个餐厅表,一个位置表,一个表以及一些辅助表,例如和。现在,我想插入一个新的餐厅条目,其中包含位置和食物类型信息(如果该条目不存在)。 所以像这样: 如何使用简单的SQL执行此操作? 问题答案: 我只是在脑海中写下了这个,但是如果您必须使用简单的sql来做的话,这应该是个主意。 编辑: 同样,我无法解析它,但您可能可以使用WITH