UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)
Implementieren Sie idempotente Einfügungen mit ON CONFLICT DO UPDATE, verwenden Sie EXCLUDED und wählen Sie das passende Konfliktziel.
UPSERT: ON CONFLICT DO UPDATE (PostgreSQL) ist eine kostenlose SQL Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des SQL Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.
Was ist UPSERT?
UPSERT = INSERT, wenn die Zeile nicht existiert, UPDATE, wenn sie bereits existiert. In PostgreSQL lautet die Syntax INSERT ... ON CONFLICT.
ON CONFLICT DO NOTHING
Einfügen, wenn die Zeile fehlt, und bei einem Duplikat stillschweigend überspringen:
INSERT INTO users (email, full_name)
VALUES ('alice@example.com', 'Alice')
ON CONFLICT (email) DO NOTHING;ON CONFLICT DO UPDATE
Einfügen, wenn die Zeile fehlt, andernfalls bestimmte Spalten aktualisieren:
INSERT INTO users (email, full_name, last_login)
VALUES ('alice@example.com', 'Alice', NOW())
ON CONFLICT (email)
DO UPDATE SET
full_name = EXCLUDED.full_name,
last_login = EXCLUDED.last_login;EXCLUDED: die vorgeschlagene Zeile
Innerhalb von DO UPDATE steht EXCLUDED.col für „den Wert, den INSERT einzufügen versucht hat“. Der einfache Spaltenname (oder users.col) steht für die vorhandene Zeile.
ON CONFLICT (email)
DO UPDATE SET visits = users.visits + 1,
last_seen = EXCLUDED.last_seen;Das Konfliktziel
Sie müssen eine UNIQUE-Constraint oder einen Primärschlüssel angeben:
ON CONFLICT (email) -- column with UNIQUE
ON CONFLICT (user_id, day) -- composite UNIQUE
ON CONFLICT ON CONSTRAINT users_email_key -- by nameBedingtes UPSERT (WHERE in DO UPDATE)
Aktualisieren Sie nur, wenn eine Bedingung erfüllt ist:
INSERT INTO inventory (product_id, qty)
VALUES (42, 5)
ON CONFLICT (product_id)
DO UPDATE SET qty = inventory.qty + EXCLUDED.qty
WHERE inventory.qty + EXCLUDED.qty <= 1000;Mehrzeiliges UPSERT
Fügen Sie mehrere Zeilen ein; jede Zeile wird separat verarbeitet:
INSERT INTO page_views (path, day, count)
VALUES ('/home', CURRENT_DATE, 1), ('/about', CURRENT_DATE, 1)
ON CONFLICT (path, day)
DO UPDATE SET count = page_views.count + EXCLUDED.count;RETURNING mit UPSERT
Geben Sie die resultierende Zeile zurück, unabhängig davon, ob sie eingefügt oder aktualisiert wurde:
INSERT INTO users (email, full_name)
VALUES ('alice@example.com', 'Alice')
ON CONFLICT (email) DO UPDATE
SET full_name = EXCLUDED.full_name
RETURNING id, full_name;Idempotente Workflows
UPSERT macht Wiederholungen sicher. Wenn Ihr Webhook zweimal ausgelöst wird, aktualisiert der zweite Aufruf dieselbe Zeile, anstatt ein Duplikat anzulegen.
MERGE (SQL-Standard, PG15+)
PostgreSQL 15 hat den SQL-Standardbefehl MERGE hinzugefügt, der INSERT, UPDATE und DELETE in einer Anweisung ausführen kann:
MERGE INTO users AS u
USING (VALUES ('alice@example.com','Alice')) AS src(email, name)
ON u.email = src.email
WHEN MATCHED THEN UPDATE SET full_name = src.name
WHEN NOT MATCHED THEN INSERT (email, full_name) VALUES (src.email, src.name);Wann Sie UPSERT nicht verwenden sollten
UPSERT erfordert eine UNIQUE-Constraint. Wenn keine vorhanden ist, benötigen Sie normalerweise ein separates SELECT und anschließend ein INSERT oder UPDATE – achten Sie jedoch auf Race Conditions und kapseln Sie den Vorgang in einer Transaktion mit geeigneten Sperren.
Zusammenfassung
ON CONFLICT ist das saubere, atomare UPSERT von PostgreSQL.
- DO NOTHING für „einfügen, wenn nicht vorhanden“
- DO UPDATE für ein echtes UPSERT
EXCLUDED= die vorgeschlagene Zeile- Geben Sie immer ein Konfliktziel an
Kurzer Test
Worauf verweist EXCLUDED in ON CONFLICT (email) DO UPDATE SET last_login = EXCLUDED.last_login?
Häufig gestellte Fragen
Ist die Lektion „UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)“ kostenlos?
Ja — der vollständige Text von „UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des SQL Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)“?
Implementieren Sie idempotente Einfügungen mit ON CONFLICT DO UPDATE, verwenden Sie EXCLUDED und wählen Sie das passende Konfliktziel. Du übst SQL Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um SQL Academy zu starten?
Keine Vorkenntnisse erforderlich. SQL Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser SQL Academy-Lektion Code schreiben und ausführen?
Ja. Jede SQL Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- INSERT mit mehreren Zeilen
- UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)
- UPDATE mit FROM und JOIN-ähnliche Aktualisierungen
- DELETE mit USING und sichere Muster