将多个upsert语句的结果捕获到Postgresql的一个输出中

时间:2017-04-05 19:43:51

标签: sql postgresql upsert knex.js

我在一次运行中运行多个upsert语句。可以根据数据添加或更新查询。是否可以知道是否发生了新插入。

test_unique 是将column1和column2组合在一起的唯一约束。

insert into test(column1,column2) values(1,1) ON CONFLICT ON CONSTRAINT test_unique DO NOTHING;
insert into test(column1,column2) values(1,2) ON CONFLICT ON CONSTRAINT test_unique DO NOTHING;
insert into test(column1,column2) values(1,1) ON CONFLICT ON CONSTRAINT test_unique DO NOTHING;

如果我们采取上述查询

  • 第一个查询将插入一个新行
  • 第二个查询也会插入一个新行
  • 第三次查询将无效

以批处理方式运行这些查询时,任何客户端库都将捕获上一个查询的输出,并返回0行。

有没有办法知道一个插入,无论它在查询中的位置如何?

由于

1 个答案:

答案 0 :(得分:2)

您可以使用returning

with i1 as (
      insert into test(column1,column2) values(1,1)
          ON CONFLICT ON CONSTRAINT test_unique DO NOTHING
          returning *
     ),
     i2 as (
      insert into test(column1,column2) values(1,2)
          ON CONFLICT ON CONSTRAINT test_unique DO NOTHING
          returning *
     ),
     i3 as (
      insert into test(column1,column2) values(1,1)
          ON CONFLICT ON CONSTRAINT test_unique DO NOTHING
          returning *
    )
select id from i1 union all
select id from i2 union all
select id from i3;