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

Postgres中的多行插入操作应该返回失败的行信息

柴华灿
2023-03-14

我想在Postgres中使用单个insert语句插入多行。

这里的问题是,如果单行插入失败,则所有其他成功的插入都将被回滚。有没有办法避免回滚并使查询返回失败行的列表。

否则,我会编写一个insert语句的循环。我正在使用节点pg模块。如果postgres不支持,有没有推荐的方法来达到我的要求?

编辑-1

insert into test(name, email) values ('abcd', 'abcd@a'), ('efgh', 'blah'), (null, 'abcd') ON CONFLICT DO NOTHING;

ERROR:  null value in column "name" violates not-null constraint
DETAIL:  Failing row contains (9, null, abcd).

完成上述查询后,select 语句返回 0 行。我正在寻找一个解决方案,其中插入前两行。

共有1个答案

梁丘德寿
2023-03-14

听起来你正在谈论的失败正在触及某种独特的约束?看看 PostgreSQL 在冲突更新时插入(更新插入)使用所有排除的值来回答与插入相关的问题...在冲突用法上。

例如,如果您执行插入到 X 值 (...100 行...)在冲突中什么都不做;任何与主键发生冲突的重复项都将被忽略。“不执行任何操作”的替代方法是对冲突执行更新。

编辑以匹配新陈述的问题。On conflict对空约束冲突没有帮助。您可以使用WITH子句,只选择没有空属性的值。这里有一个我刚刚在Postgres测试的样本:

create extension if not exists pgcrypto;
create table tmp (id uuid primary key default gen_random_uuid());

with data_set_to_insert as (
    select x.id from (values (null), (gen_random_uuid())) x(id) -- alias x can be anything, does not matter what it is
)
insert into tmp(id) select id from data_set_to_insert where id is not null returning *;
 类似资料:
  • 假设我有下表: 我需要一个查询,将插入不存在的标签,并返回所有请求的标签ID。考虑以下事项: 此查询的输出是: 我需要的是在输出中有。

  • 但现在我也需要知道: 插入了多少行 由于现有而更新了多少行 由于约束无法插入多少行 如果最后一行没有遵守约束,那么以前插入/更新的行是否会保留在数据库中?

  • 问题内容: 我有这样的UPSERT操作: 是一个复合主键,与“ people”表相比,“ people_update”表包含其他行和已更改的行。 我的问题是:有没有办法将查询的插入行和更新行作为返回行? 编辑:我通过添加一个子句中途解决了问题,但我也想在我的返回值中获取旧值。 问题答案: 如果将布尔更新的列添加到表中: 那么您可以通过在子句中进行设置来标识更新的行: 例如, 产量 该列显示和行已更

  • 问题内容: 在一个SQL语句中,我尝试插入一行,如果由于约束而失败,则返回现有行。 我有: 该列具有唯一约束。我尝试在末尾追加,但这仍然不返回现有行。 为什么是这样?我以为我的最后一条语句将被执行并返回。有任何想法吗? 注意:由于某些复杂的竞争条件,我无法使用Postgres函数或多个SQL语句。 问题答案: WITH d(t, e) AS ( VALUES (‘abcdefg’, ‘2014-0

  • 我试图使用console.log(结果),但似乎得到了一组方法,但我不知道如何获得所需的信息。

  • 问题内容: 通常,我可以在MySQL表中插入一行并取回。但是,现在,我想将许多行批量插入表中并获取ID数组。有人知道我该怎么做吗? 有一些类似的问题,但并不完全相同。我不想将新ID插入任何临时表;我只想找回ID数组。 我可以从批量插入中检索lastInsertId吗? 带有last_insert_id()的MySQL多行插入选择语句 问题答案: 旧线程,但只是研究了一下,所以去了:如果您在最新版本