it-swarm.com.de

PostgreSQL INSERT ON CONFLICT UPDATE (UPSERT) verwendet alle ausgeschlossenen Werte

Wenn Sie eine Zeile auf den Kopf stellen (PostgreSQL> = 9.5) und möchten, dass das mögliche INSERT genau dem möglichen UPDATE entspricht, können Sie es folgendermaßen schreiben:

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

Gibt es einen kürzeren Weg? Um nur zu sagen: Verwenden Sie alle EXCLUDE-Werte.

In SQLite habe ich Folgendes gemacht:

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

Postgres hat kein Äquivalent zu INSERT OR REPLACE Implementiert. Aus den ON CONFLICT - Dokumenten (Hervorhebung meiner):

Dies kann entweder DO NOTHING oder eine DO UPDATE-Klausel sein, die die genauen Details der UPDATE-Aktion angibt, die im Falle eines Konflikts ausgeführt werden soll.

Obwohl es keine Abkürzung für das Ersetzen gibt, gilt ON CONFLICT DO UPDATE Allgemeiner, da Sie neue Werte basierend auf bereits vorhandenen Daten festlegen können. Zum Beispiel:

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