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

时间:2018-03-25 17:12:32

标签: node.js postgresql

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

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

否则,我最终会编写一个insert语句循环。我正在使用Node 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 个答案:

答案 0 :(得分:1)

听起来你正在谈论的失败是在达到某种独特的约束吗?请查看PostgreSQL INSERT ON CONFLICT UPDATE (upsert) use all excluded values以获取与插入...有关冲突使用的问题。

例如,如果您执行INSERT INTO X VALUES (...100 rows...) ON CONFLICT DO NOTHING;任何与主键冲突的重复项都将被忽略。 DO NOTHING的替代方案是对冲突进行更新。

编辑以匹配新陈述的问题。关于冲突无助于违反空约束。您可以执行WITH子句并仅选择不带null属性的值。这是我刚刚在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 *;