小编典典

如何在PostgreSQL中结合使用ON CONFLICT和RETURNING?

sql

我在PostgreSQL 9.5中具有以下UPSERT:

INSERT INTO chats ("user", "contact", "name") 
           VALUES ($1, $2, $3), 
                  ($2, $1, NULL) 
ON CONFLICT("user", "contact") DO NOTHING
RETURNING id;

如果没有冲突,则返回以下内容:

----------
    | id |
----------
  1 | 50 |
----------
  2 | 51 |
----------

但是,如果有冲突,则不会返回任何行:

----------
    | id |
----------

id如果没有冲突,我想返回新列,或者返回id冲突列的现有列。
能做到吗?如果是这样,怎么办?


阅读 282

收藏
2021-04-14

共1个答案

小编典典

我遇到了完全相同的问题,即使我没有要更新的内容,我还是使用“执行更新”而不是“不执行任何操作”解决了该问题。在您的情况下,将是这样的:

INSERT INTO chats ("user", "contact", "name") 
       VALUES ($1, $2, $3), 
              ($2, $1, NULL) 
ON CONFLICT("user", "contact") DO UPDATE SET name=EXCLUDED.name RETURNING id;

该查询将返回所有行,无论它们刚刚被插入还是之前已经存在。

2021-04-14