Spring til indhold
Academi.dk

SQL

INSERT, UPDATE og DELETE

Let øvet DA↔EN-ordliste

De tre kommandoer, der ændrer data. INSERT tilføjer rækker, UPDATE ændrer eksisterende, og DELETE fjerner dem. Både UPDATE og DELETE rammer alle rækker i tabellen, hvis du glemmer WHERE, og det kan ikke fortrydes.

Forudsætter, at du har set where - filtrér rækker .

INSERT

INSERT INTO kunde (navn, email, postnr)
VALUES ('Ida Hansen', 'ida@example.dk', 2000);

Skriv altid kolonnenavnene. Formen uden dem afhænger af tabellens rækkefølge, og den ændrer sig, den dag nogen tilføjer en kolonne.

Flere rækker på én gang:

INSERT INTO produkt (navn, pris)
VALUES ('Kaffe', 89), ('Kop', 45), ('Kande', 199);

Feltet id udelader du som regel. Databasen tæller selv op. Skal du bruge det nye id bagefter, spørger du databasen om det; hvordan afhænger af systemet.

UPDATE

UPDATE produkt
SET pris = 95
WHERE id = 3;

SET kan sætte flere kolonner adskilt af komma, og du må gerne regne på den eksisterende værdi:

UPDATE produkt
SET pris = pris * 1.1, opdateret = GETDATE()
WHERE kategori = 'kaffe';

DELETE

DELETE FROM ordre
WHERE dato < '2020-01-01';

Har en anden tabel en fremmednøgle, der peger på rækken, afviser databasen sletningen. Det er referentiel integritet, og det er en funktion, ikke en forhindring.

Vanen, der forhindrer ulykken

Skriv altid din UPDATE eller DELETE som en SELECT først, med præcis den samme WHERE:

-- 1: se hvad der bliver ramt
SELECT * FROM produkt WHERE kategori = 'kaffe';

-- 2: er det de rigtige rækker? Så skriv om til:
UPDATE produkt SET pris = pris * 1.1 WHERE kategori = 'kaffe';

Det tager fem sekunder og redder din database. Arbejder du direkte i produktionen

  • hvilket I forhåbentlig ikke gør i projektet, så kør det også inde i en transaktion, så du kan rulle tilbage.

Sletning er ikke altid det, du vil

I et system med ordrer og kunder er det sjældent rigtigt at slette. Historikken skal typisk kunne genfindes, både af hensyn til bogføring og til rapporter. Den almindelige løsning er at markere rækken i stedet:

UPDATE kunde SET aktiv = 0 WHERE id = 12;

Så skal alle forespørgsler til gengæld huske WHERE aktiv = 1. Det er en afvejning, og det er en god ting at kunne begrunde i rapporten.

Kort opsamling

  • Skriv kolonnenavnene i INSERT.
  • UPDATE … SET … WHERE og DELETE FROM … WHERE.
  • Uden WHERE rammer de hele tabellen.
  • Kør altid en SELECT med samme betingelse først.

Læs videre

Senest gennemgået .