1. ホーム
  2. sql

[解決済み】PostgreSQLでON CONFLICTとRETURNINGを使用する方法は?

2022-04-03 16:31:30

質問

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 のカラムが競合していることを示す。

これは可能なのでしょうか? もしそうなら どのように?

どのように解決するのですか?

私も全く同じ問題を抱えており、更新するものがないにもかかわらず、「何もしない」ではなく「更新する」を使って解決しました。あなたの場合、次のような感じでしょうか。

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;

このクエリは、挿入されたばかりか、以前から存在していたかにかかわらず、すべての行を返します。