1. ホーム
  2. postgresql

[解決済み] PostgreSQLのINSERT ON CONFLICT UPDATE(upsert)は除外された値をすべて使用します。

2022-04-19 08:59:17

質問

行を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]')

解決方法は?

Postgres は、この関数と同等のものを実装していません。 INSERT OR REPLACE . からは ON CONFLICT ドキュメント (強調)。

これは、DO NOTHINGか、DO UPDATE句の指定で 正確な内容 は、競合が発生した場合に実行されるUPDATEアクションを示します。

置換の略語は出てきませんが。 ON CONFLICT DO UPDATE は、既存のデータに基づいて新しい値を設定することができるため、より一般的に適用されます。例えば

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