将多个 upsert 语句的结果捕获到 Postgresql 的一个输出中
Capture the result of multiple upsert statement into one output for Postgresql
我运行在单个 运行 中加入多个更新插入语句。可以根据数据添加或更新查询。有可能知道是否发生了新的插入。
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;
如果我们进行上述查询
- 第一个查询将插入一个新行
- 第二个查询也将插入一个新行
- 第三个查询将不执行任何操作
当 运行 将这些查询作为批处理时,任何客户端库都将捕获最后一个查询的输出,并将 return 0 行。
有没有办法知道即使是单个插入而不考虑它在查询中的位置?
谢谢
您可以使用 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;
我运行在单个 运行 中加入多个更新插入语句。可以根据数据添加或更新查询。有可能知道是否发生了新的插入。
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;
如果我们进行上述查询
- 第一个查询将插入一个新行
- 第二个查询也将插入一个新行
- 第三个查询将不执行任何操作
当 运行 将这些查询作为批处理时,任何客户端库都将捕获最后一个查询的输出,并将 return 0 行。
有没有办法知道即使是单个插入而不考虑它在查询中的位置?
谢谢
您可以使用 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;