web-dev-qa-db-ja.com

PostgreSQLのINSERT ON CONFLICT UPDATE(upsert)はすべての除外値を使用します

行を更新(PostgreSQL> = 9.5)していて、可能なINSERTを可能なUPDATEと正確に同じにしたい場合は、次のように書くことができます。

INSERT INTO tablename (id, username, password, level, email) 
                VALUES (1, 'John', 'qwerty', 5, '[email protected]') 
ON CONFLICT (id) DO UPDATE SET 
  id=EXCLUDED.id, username=EXCLUDED.username,
  password=EXCLUDED.password, level=EXCLUDED.level,email=EXCLUDED.email

もっと短い方法はありますか?一言で言うと、すべてのEXCLUDE値を使用します。

SQLiteでは、以前は次のようにしていました。

INSERT OR REPLACE INTO tablename (id, user, password, level, email) 
                        VALUES (1, 'John', 'qwerty', 5, '[email protected]')
92
Sebastian

PostgresはINSERT OR REPLACEと同等のものを実装していません。 ON CONFLICT docs から(私の強調点):

DO NOTHING、または競合の場合に実行されるUPDATEアクションの正確な詳細を指定するDO UPDATE句のいずれかです。

それはあなたに置き換えの速さを与えるものではありませんが、それはあなたが既存のデータに基づいて新しい値を設定することを可能にするのでON CONFLICT DO UPDATEはより一般的に適用されます。例えば:

INSERT INTO users (id, level)
VALUES (1, 0)
ON CONFLICT (id) DO UPDATE
SET level = users.level + 1;
113
Kristján