UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)
Implementér idempotente indsættelser med ON CONFLICT DO UPDATE, brug EXCLUDED, og vælg det rette konfliktmål.
UPSERT: ON CONFLICT DO UPDATE (PostgreSQL) er en gratis SQL Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i SQL Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. SQL Academy-kurset indeholder 4 lektioner i alt.
Hvad er UPSERT?
UPSERT = INSERT, hvis rækken ikke findes, og UPDATE, hvis den gør. PostgreSQL skriver det som INSERT ... ON CONFLICT.
ON CONFLICT DO NOTHING
Indsæt, hvis rækken mangler, og spring den lydløst over, hvis den er en duplikat:
INSERT INTO users (email, full_name)
VALUES ('alice@example.com', 'Alice')
ON CONFLICT (email) DO NOTHING;ON CONFLICT DO UPDATE
Indsæt, hvis rækken mangler, og opdatér ellers bestemte kolonner:
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: Den foreslåede række
I DO UPDATE betyder EXCLUDED.col "den værdi, som INSERT forsøgte at indsætte". Det nøgne kolonnenavn (eller users.col) betyder den eksisterende række.
ON CONFLICT (email)
DO UPDATE SET visits = users.visits + 1,
last_seen = EXCLUDED.last_seen;Konfliktmålet
Du skal angive en unik begrænsning eller en primærnøgle:
ON CONFLICT (email) -- column with UNIQUE
ON CONFLICT (user_id, day) -- composite UNIQUE
ON CONFLICT ON CONSTRAINT users_email_key -- by nameBetinget UPSERT (WHERE i DO UPDATE)
Opdatér kun, når en betingelse er opfyldt:
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;UPSERT med flere rækker
Indsæt mange rækker; hver række behandles separat:
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 med UPSERT
Hent den resulterende række tilbage, uanset om den blev indsat eller opdateret:
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 arbejdsgange
UPSERT gør gentagelser sikre. Hvis din webhook udløses to gange, opdaterer det andet kald den samme række i stedet for at oprette en duplikat.
MERGE (SQL-standarden, PG15+)
PostgreSQL 15 tilføjede den SQL-standardiserede MERGE, som kan udføre INSERT, UPDATE og DELETE i én sætning:
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);Hvornår du ikke skal bruge UPSERT
UPSERT kræver en unik begrænsning. Hvis du ikke har en, vil du normalt bruge en separat SELECT efterfulgt af INSERT eller UPDATE — men pas på kapløbsforhold; pak det ind i en transaktion med passende låsning.
Opsummering
ON CONFLICT er PostgreSQLs rene, atomiske UPSERT.
- DO NOTHING til "indsæt, hvis den ikke findes"
- DO UPDATE til en ægte upsert
EXCLUDED= den foreslåede række- Angiv altid et konfliktmål
Hurtigt tjek
I ON CONFLICT (email) DO UPDATE SET last_login = EXCLUDED.last_login, hvad henviser EXCLUDED til?
Lær SQL med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 46
- Lektioner
- 183
Ofte stillede spørgsmål
Er lektionen “UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)” gratis?
Ja — hele teksten til “UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af SQL Academy-kurset, skal du opgradere til CoddyKit PRO. SQL Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)”?
Implementér idempotente indsættelser med ON CONFLICT DO UPDATE, brug EXCLUDED, og vælg det rette konfliktmål. Du øver dig i SQL Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på SQL Academy?
Der kræves ingen tidligere erfaring. SQL Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.
Hvor lang tid tager lektionen “UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne SQL Academy-lektion?
Ja. Alle SQL Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- INSERT med flere rækker
- UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)
- UPDATE med FROM og JOIN-lignende opdateringer
- DELETE med USING og sikre mønstre