【问题标题】:query of type "INSERT ON CONFLICT DO NOTHING RETURNING" returns nothing“INSERT ON CONFLICT DO NOTHING RETURNING”类型的查询不返回任何内容
【发布时间】:2019-09-20 04:46:22
【问题描述】:

“returning”语句返回 0 行,但我想要因为冲突而无法插入的行。我在那里缺少什么?

detail: 表 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 返回被插入的值,所以这并不让我感到惊讶——没有插入任何行,所以没有任何返回值。可能有一种解决方法,但在这个简化的示例中,我看不出你为什么需要这样做——它所做的只是返回你已经知道的值。我担心的是一种解决方法可能特定于您所拥有的实际场景,并且不适用于简化示例,因此可能值得多解释一下您为什么需要它。

标签: postgresql upsert


【解决方案1】:

DO NOTHING不适用于RETURNING

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

reference

【讨论】:

  • 引用的文字不支持您的声明 - 它提到了ON CONFLICT DO UPDATE,但没有提及DO NOTHING 的行为。如果您是对的,它没有改变RETURNING 的行为,那么这意味着问题中的查询还有其他问题。无论哪种方式,这都不能回答问题。
  • 以某种方式绕过 DO NOTHING 与 RETURNING 的不兼容使用以获得冲突的行列?
  • @IMSoP 该文档明确描述了RETURNING 适用的情况。因此,任何未涵盖的情况都必须假定为不适用于RETURNING 的上下文。
  • @Ancoron “不适用”是什么意思?我们可以对引用是否相关问题一头雾水,但我看不出它如何回答页面顶部的问题。您的答案是“您的问题是错误的,您的查询应该有效”吗?或者只是“是的,这是记录在案的行为”?两者似乎都不是特别有用。
  • @IMSoP 我基本上没有回答实际问题,而是过于关注没有返回任何行的事实(因为实际上没有发生任何事情)来解释原因。
【解决方案2】:

将 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;吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-02
  • 2021-02-05
  • 1970-01-01
  • 2022-01-19
  • 2021-11-02
  • 1970-01-01
  • 2018-08-02
相关资源
最近更新 更多