SQL-UPDATE vs. INVOEGEN vs. UPSERT

In dit artikel worden drie SQL-statements bekeken: UPDATE, INVOEGEN en UPSERT. Het bevat voorbeelden van hoe en wanneer ze moeten worden gebruikt.

SQL UPDATE vs. INSERT vs. UPSERT

image_pdfimage_print

In elke toepassing moet u records toevoegen aan databasetabellen en de informatie die ze opslaan wijzigen. De UPDATE SQL-statement verandert data die al in de database zijn opgeslagen, en de INSERT-statement voegt een nieuw record toe aan een tabel. De UPSERT-verklaring is een combinatie van INVOEGEN en BIJWERKEN en voert een update uit of voegt een record toe als deze nog niet bestaat. Hier gaan we het hebben over SQL UPDATE vs. INVOEGEN vs. UPSERT.

Hoe UPDATE te gebruiken in SQL: Voorbeelden

De UPDATE-verklaring werkt een actueel record bij met nieuwe informatie die u specificeert. Een klant kan bijvoorbeeld verhuizen en zijn contactgegevens wijzigen in een e-commercetabel, en een UPDATE-statement zal de wijziging uitvoeren. Alle wijzigingen die u in een database aanbrengt, maken gebruik van de UPDATE-verklaring.

Het is belangrijk op te merken dat het optimaliseren van query’s de databaselatentie vermindert. Een geoptimaliseerde UPDATE-query kan de dataverwerking verminderen tot slechts milliseconden. Infrastructuur is ook belangrijk voor lage latency op databaseservers met een groot volume. Gebruik de volgende vragen om aan de slag te gaan. Het indexeren van kolommen die gewoonlijk worden bijgewerkt, kan helpen de prestaties te verbeteren. Bij grote Gelijktijdige workloads kan het nodig zijn dat databaseontwikkelaars isolatieniveaus gebruiken om verklaringen te beschermen tegen het beïnvloeden van andere verklaringen die ook worden verwerkt.

Daarnaast moeten ontwikkelaars en databasebeheerders foutafhandeling in hun code hebben. Deze voorbeelden laten zien hoe elke opdracht moet worden uitgevoerd, maar uw bedrijfslogica moet bepalen wat u moet doen als een fout optreedt. Als de database bijvoorbeeld geen nieuw klantendossier invoegt, waarschuw de gebruiker dan om het opnieuw te proberen of neem contact op met de klantenservice. Database latency, fouten en optimalisatiewaarschuwingen kunnen worden uitgevoerd met performance monitoring tools.

UPDATE in SQL: Voorbeelden

Voor de meeste SQL UPDATE-statements gebruikt u de WHERE-clausule. De WHERE-clausule bepaalt welke records worden bijgewerkt en laat de andere onaangetast. Als u geen WHERE-clausule gebruikt bij het uitvoeren van een UPDATE-statement, zal de database wijzigingen aanbrengen in alle records in de database, wat waarschijnlijk een fout is. Zorg ervoor dat u een WHERE-clausule in uw SQL-statement hebt om deze fout te voorkomen.

De UPDATE-statementsyntaxis hangt af van de database-engine die u gebruikt. De MySQL- en Oracle SQL-databases gebruiken een vergelijkbare syntaxis voor hun UPDATE-statements. De volgende voorbeelden veranderen de voornaam van een klant in “john”, waarbij de klant-ID 44 is.

Hoe INSERT te gebruiken in SQL: Voorbeelden

Wanneer u een nieuw record aan een tabel wilt toevoegen, gebruikt u de SQL-instructie INVOEGEN. De meeste databaseontwerpers maken een standaardkolom om elk record een unieke identificatie te geven. De unieke identificatiecode wordt automatisch ingevuld, zodat u deze niet handmatig invoegt en de database-engine het voor u laat doen. U kunt geen dubbele waarden invoegen in identificatierijen, dus het is efficiënter om de database toe te staan dit voor u te doen.

In de volgende voorbeelden wordt een nieuwe klant aan de klanttabel toegevoegd met een voornaam en achternaam die in de juiste kolommen worden ingevuld. Merk op dat de kolommen worden gedefinieerd samen met de waarden die respectievelijk aan elke kolom moeten worden toegevoegd.

Hoe UPSERT in SQL te gebruiken: Voorbeelden

De UPSERT-opdracht is een nuttige verklaring wanneer u alleen een rij wilt invoegen als deze nog niet bestaat. Als het al bestaat, zal de database het record bijwerken in plaats van nieuwe informatie. De Oracle-database-engine heeft een specifieke UPSERT-opdracht. Bij MySQL gebruikt de opdracht in plaats daarvan de term VERVANGEN.

Applicatieontwikkelaars gebruiken het UPSERT-commando om dubbele records te vermijden, vooral wanneer ze unieke identifiers aan hen gekoppeld hebben, en applicatieverklaringen mogen geen record invoegen vanwege een eerder bestaand record. Het gebeurt vaak wanneer u data van de ene tabel naar de andere importeert, en het is mogelijk dat er dubbele records bestaan. U krijgt bijvoorbeeld een lijst met klantdossiers van een overgenomen bedrijf en weet dat sommige klanten al in de huidige bedrijfsdatabase staan. De UPSERT-verklaring zal alleen bestaande klanten bijwerken en nieuwe toevoegen waar ze niet bestaan.

Als in het bovenstaande voorbeeld de klant met een identifier van 44 al bestaat, wordt het oorspronkelijke record verwijderd en wordt vervolgens een nieuw klantrecord met een identifier van 44 toegevoegd. Het is belangrijk om te onthouden dat het commando REPLACE geen data technisch bijwerkt. In plaats daarvan wordt een rij verwijderd en opnieuw aan de tabel toegevoegd.

Met Oracle zal het UPSERT-commando de klant bijwerken met een identificatiecode van 44 in plaats van het te verwijderen en opnieuw toe te voegen. Als het record niet bestaat, zal de Oracle-engine het klantrecord aan de tabel toevoegen.

PostGreSQL heeft geen specifieke UPSERT-verklaring, maar ondersteunt een type INSERT waarbij de server alleen een nieuw record zal invoegen als het nog niet bestaat. Als het record bestaat, moeten tabelbeperkingen een fout veroorzaken en een UPDATE uitvoeren in plaats van een INSERT-statement. De PostGreSQL-syntaxis staat hieronder:

Microsoft SQL Server ondersteunt ook geen UPSERT-statement, maar ontwikkelaars kunnen de opdracht MERGE gebruiken om een soortgelijke actie uit te voeren. De MERGE-statement neemt een brondataset en voegt deze samen met een tabel, maar voegt alleen een nieuw record in als er geen rij bestaat. Als er een rij bestaat, zal de MERGE-verklaring het record bijwerken. 

MongoDB heeft een UPDATE-opdrachtparameter om de database te vertellen een UPSERT-statement uit te voeren. Net als de andere databases zal MongoDB alleen een nieuw record invoegen als het record niet bestaat. Als het wel bestaat, zal de database op een record presteren en bijwerken.

UPDATE vs. INVOEGEN: Verschillen in SQL

De meeste applicaties gebruiken verschillende UPDATE- en INSERT-statements om data te beheren. INSERT-statements zijn noodzakelijk wanneer u een record moet toevoegen. Wanneer u reeds opgeslagen data moet wijzigen, is de UPDATE-verklaring noodzakelijk.

De INSERT-verklaring vereist alle kolommen die moeten worden gevuld met de noodzakelijke waarden. De UPDATE-verklaring vereist niet de WHERE-clausule, maar als u deze uitsluit, worden alle records bijgewerkt met de gegeven data. Het is onwaarschijnlijk dat u alle records wilt bijwerken, dus zorg ervoor dat u de WHERE-clausule opneemt.

U kunt UPDATE niet gebruiken in plaats van INVOEGEN, maar de UPSERT-verklaring is een goed alternatief. Met de UPSERT-verklaring werkt de database records bij waar ze beschikbaar zijn en voegt deze in de tabel in als de record niet bestaat. INVOEGEN is sneller dan een UPDATE-statement, mits een database goed is geoptimaliseerd.

UPSERT vs. UPDATE en INVOEGEN: Welke is beter?

De verklaring die u gebruikt, hangt af van wat u wilt doen met de data in uw database. Voor prestaties is INSERT beter dan UPSERT, maar u kunt niet altijd voorkomen dat u een UPDATE-statement gebruikt en een manier nodig hebt om te verifiëren dat het record nog niet bestaat. De UPSERT-verklaring vereenvoudigt het hele proces in plaats van een langere IF-verklaring te schrijven in een opgeslagen procedure. Wanneer u grote updates hebt of overzichten toevoegt om data te importeren en geen duplicaten wilt, is de UPSERT-verklaring beter voor de prestaties. U voltooit zowel UPDATE als INSERT in één actie.

Wanneer UPDATE gebruiken in SQL

De enige manier om data in een databasetabel te wijzigen is met de UPDATE-statement. Applicaties veranderen voortdurend van data om verschillende redenen en ze gebruiken SQL UPDATE-statements in de backend. Wanneer u uw contactgegevens, creditcardgegevens of een verzendadres voor een account online wijzigt, is het waarschijnlijk dat het backend-applicatiesysteem een UPDATE-overzicht uitvoert.

Gebruik UPDATE wanneer u alleen data hoeft te bewerken en duplicaten geen probleem zijn. Een eenvoudige UPDATE-statement is niet traag, maar hoe meer kolommen en rijen moeten worden bewerkt, hoe trager de databaseservices kunnen zijn. Het kan nuttig zijn om een grote batch UPDATE-statement uit te voeren tijdens daluren.

Wanneer INSERT in SQL te gebruiken

U hebt de verklaring INVOEGEN nodig wanneer u een record aan een tabel wilt toevoegen. Wanneer u zich aanmeldt voor een applicatie of een nieuw product bij een e-commerce store bestelt, gebruikt de backend-database de SQL-statement INVOEGEN om een nieuw record aan de database toe te voegen. Het nieuwe record kan later worden gewijzigd met de UPDATE-statement, maar het wordt eerst aangemaakt met de INSERT-statement.

INSERT-statements zijn over het algemeen snel. Wanneer u een record moet toevoegen, is dit onvermijdelijk. Net als UPDATE-statements kunnen grote inserts (bijv. zoals het importeren van data uit een statisch bestand) beter worden geoptimaliseerd als ze tijdens daluren draaien. Logbestanden voor auditing en logging gebruiken eenvoudige INSERT-statements.

Wanneer UPSERT in SQL gebruiken

De UPSERT-verklaring heeft de minste prestaties van alle drie de commando’s, maar heeft een doel wanneer u meerdere records aan een tabel wilt toevoegen en ze niet wilt dupliceren. Wanneer u data in een tabel importeert en denkt dat er dubbele records kunnen zijn, gebruik dan de UPSERT-verklaring om de huidige records bij te werken in plaats van dubbele toe te voegen. Als u bijvoorbeeld klanten uit een extern bestand naar uw databasetabellen moet importeren, kan een UPSERT-verklaring geschikter zijn dan het gebruik van een INSERT-verklaring.

UPSERT-statements zijn over het algemeen gunstig als u een grote brondataset hebt die duplicaten kan hebben. U zou bijvoorbeeld geen producttabel willen dupliceren, dus zou u UPSERT gebruiken in plaats van één INSERT-statement te gebruiken en later duplicaten te verwijderen. UPSERT is geweldig wanneer u grote hoeveelheden data hebt, maar kan latentieproblemen veroorzaken als ze onnodig worden gebruikt voor alle INSERT-statements. Gebruik UPSERT alleen wanneer u duplicaten in een hoofdtabel kunt importeren.

FAQ

UPSERT is over het algemeen veiliger dan met de hand gerolde “select then insert”-logica onder hoge gelijktijdigheid omdat de conflictdetectie en -oplossing binnen één atoombewerking worden afgehandeld. U moet er nog steeds voor zorgen dat de juiste indexen en unieke beperkingen aanwezig zijn, zodat de database conflicten snel kan oplossen en onnodige vergrendeling of onenigheid kan voorkomen.

De meest betrouwbare manier om duplicaten te voorkomen is door een primaire sleutel of unieke beperking op de kolom of set kolommen te definiëren die uniek moet zijn, en vervolgens uw INVOEGEN of UPSERT rond die beperking te schrijven. De database-engine zal uniciteit afdwingen op het moment van schrijven, wat betrouwbaarder is dan handmatig te proberen te controleren op bestaande rijen in de applicatiecode.

UPSERT is het nuttigst wanneer u regelmatig hetzelfde record moet aanmaken of bijwerken op basis van een sleutel, zoals een gebruikers-ID of order-ID. Het vereenvoudigt de applicatielogica, vermindert de kans op raceomstandigheden veroorzaakt door “controleer en voeg in”-patronen en leidt vaak tot minder retouren naar de database dan het uitgeven van afzonderlijke INVOEGEN- en UPDATE-statements.

INSERT voegt een gloednieuwe rij toe, UPDATE wijzigt een bestaande rij die al aan uw criteria voldoet, en UPSERT combineert beide gedragingen door een nieuwe rij in te voegen wanneer er geen bestaat of een bestaande rij bij te werken wanneer er een match wordt gevonden. Als u denkt in termen van “creëren”, “wijzigen” en “creëren of wijzigen”, kunt u de juiste verklaring voor elke gebruikssituatie kiezen.