"INSERT ON CONFLICT DO NOTHING RETURNING" 类型的查询返回空结果。

3
“returning”语句返回0行,但我想获取由于冲突而无法插入的行。 我是否遗漏了什么?
详情:表users_strategies具有主键(id_strategy,id_account)。
xsignalsbot=# select * from users_strategies;
 id | id_strategy | id_account | risk | active
----+-------------+------------+------+--------
  1 |           1 |         48 | 0.50 | t
  2 |           2 |         48 | 0.25 | f
(2 rows)

xsignalsbot=# insert into users_strategies (id_strategy,id_account) 
                 values (1,48) on conflict (id_strategy,id_account) do nothing
                    returning active,risk;
 active | risk
--------+------
(0 rows)

“returning” 返回被插入的值,所以这并不让我感到惊讶 - 没有插入行,因此没有返回任何内容。可能会有一些解决方法,但在这个简化的示例中,我看不出为什么你需要它 - 它只会返回你已知的值。我的担忧是解决方法可能特定于您实际拥有的场景,并且不适用于简化的示例,因此可能值得更详细地解释一下为什么您需要它。 - IMSoP
2个回答

2
将DO NOTHING更改为UPDATE SET语句(不修改最终结果)即可获得所需的结果: "将DO NOTHING更改为UPDATE SET语句(不会修改最终结果)可获得所需结果:"
xsignalsbot=# insert into users_strategies (id_strategy,id_account) 
                 values (1,48) on conflict (id_strategy,id_account) do update set
                   id_strategy=excluded.id_strategy returning users_strategies.active, users_strategies.risk;

 active | risk
--------+------
 t      | 0.50
(1 row)

我猜您仍然需要在那里加上returning active,risk;吗? - IMSoP

2

DO NOTHING不适用于RETURNING

可选的RETURNING子句使INSERT基于实际插入的每行计算并返回值(如果使用了ON CONFLICT DO UPDATE子句,则基于更新)。

参考资料


1
引用的文本并没有支持你的说法 - 它提到了 ON CONFLICT DO UPDATE,但没有提及 DO NOTHING 的行为。如果你是正确的,它不会改变 RETURNING 的行为,那么这就意味着问题中的查询存在其他问题。无论如何,这感觉都不像是回答问题的方式。 - IMSoP
1
有没有什么方法可以解决DO NOTHING与RETURNING一起使用时出现的冲突行列的问题? - Rodrigo Formighieri
1
@IMSoP,文档明确描述了 RETURNING 适用的情况。因此,任何未涵盖的情况都必须被视为不适用于 RETURNING 的上下文。 - Ancoron
@Ancoron,“不适用”是什么意思?我们可以就引用是否相关进行争论,但我不明白它如何回答页面顶部的问题。你的答案是“你的问题是错误的,你的查询应该工作”吗?还是只是“是的,这是记录下来的行为”?两者都似乎不是特别有帮助。 - IMSoP
1
@IMSoP,我基本上没有回答实际问题,而是过于关注没有返回行(因为实际上什么也没有发生)来解释原因。 - Ancoron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接