小编典典

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

all

我在 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冲突列的现有列。
这可以做到吗? 如果是这样, 怎么做?


阅读 107

收藏
2022-05-19

共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;

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

2022-05-19