2016-04-01 17 views
43

行をアップセルしているとき(PostgreSQL> = 9.5)、可能なINSERTを可能なUPDATEとまったく同じにしたい場合は、次のように書くことができます:PostgreSQL INSERT ON CONFLICT UPDATE(upsert)すべての除外された値を使用

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]') 
+5

ない本当の答えがありますが、少しまもなく表記を使用することができます 'テーブル名。INSERT INTO(ID、ユーザ名、パスワード、レベル、電子メール)VALUES(1、 'ジョン'、 'QWERTY'、5 、 '[email protected]') ON CONFLICT(ID)DO UPDATE SET (ユーザー名、パスワード、レベル、電子メール)=(EXCLUDED.username、EXCLUDED.password、EXCLUDED.level、EXCLUDED.email)同じですが、列リストをコピー/ペースト/管理するのが簡単です – foal

+0

もう1つの選択肢はjsonb列を使用して列を気にする必要がない方法です –

答えて

53

PostgresはINSERT OR REPLACEに相当するものを実装していません。 ON CONFLICT docs(強調鉱山)から:

それは何もしない、または正確な詳細矛盾する場合に実行される更新アクションのを指定DO UPDATE句のいずれかであり得ます。

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

INSERT INTO users (id, level) 
VALUES (1, 0) 
ON CONFLICT (id) DO UPDATE 
SET level = users.level + 1; 
関連する問題