我想在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行。我正在寻找一种解决方案,其中前两行插入。
答案 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 *;