SQL TRUNCATE vs. DELETE: Slett effektivt i databasen!

Oppdag hvordan SQL-kommandoene TRUNCATE og DELETE fungerer, hva som skiller dem, og i hvilke situasjoner det er mest hensiktsmessig å bruke den ene fremfor den andre.

Når man arbeider med databasetabeller, kan det oppstå behov for å fjerne enten et utvalg av rader eller samtlige rader. For å fjerne rader fra en databasetabell, kan du bruke SQL-kommandoene TRUNCATE eller DELETE, avhengig av hva som er mest relevant for situasjonen.

I denne veiledningen skal vi gå i dybden på hver av kommandoene, se hvordan de fungerer og vurdere når det er mest hensiktsmessig å bruke TRUNCATE fremfor DELETE, og omvendt.

Før vi går videre, er det nyttig å repetere følgende SQL-undergrupper:

  • Data Definition Language (DDL)-kommandoer brukes til å opprette og administrere databaseobjekter, som for eksempel tabeller. SQL-kommandoene CREATE, DROP og TRUNCATE er eksempler på DDL-kommandoer.
  • Data Manipulation Language (DML)-kommandoer benyttes til å manipulere data i databaseobjekter. DML-kommandoer brukes til å utføre operasjoner som å opprette, lese, oppdatere og slette poster.
  • Data Query Language (DQL)-kommandoer brukes til å hente data fra databasetabeller. Alle SELECT-kommandoer faller inn under DQL-undergruppen.

Hvordan bruke SQL TRUNCATE-kommandoen

Syntaks for SQL TRUNCATE-kommandoen

Syntaksen for å bruke SQL TRUNCATE-kommandoen er som følger:

TRUNCATE TABLE tabellnavn;

Ved å kjøre TRUNCATE-kommandoen ovenfor slettes alle radene i tabellen som er angitt ved tabellnavn – selve tabellen blir ikke slettet.

Trunkeringsoperasjonen skanner ikke gjennom alle postene i tabellen. Derfor er den generelt raskere når man arbeider med store databasetabeller.

Eksempel på bruk av SQL TRUNCATE

📝 Merk: Hvis du har MySQL installert på maskinen din, kan du skrive koden ved hjelp av MySQL-kommandolinjeklienten. Du kan også bruke et annet DBMS etter eget valg, for eksempel PostgreSQL.

La oss starte med å opprette en database vi kan jobbe med:

mysql> CREATE DATABASE db1;
Query OK, 1 row affected (1.50 sec)

Deretter velger vi databasen vi nettopp opprettet:

mysql> use db1;
Database changed

Neste trinn er å opprette en databasetabell. Kjør følgende CREATE TABLE-kommando for å opprette en enkel oppgavetabell:

-- Opprett oppgavetabellen
CREATE TABLE oppgaver (
    oppgave_id INT AUTO_INCREMENT PRIMARY KEY,
    tittel VARCHAR(255) NOT NULL,
    forfallsdato DATE,
    status ENUM('Venter', 'Pågår', 'Fullført') DEFAULT 'Venter',
    ansvarlig VARCHAR(100)
);

I dette eksemplet har oppgavetabellen følgende kolonner:

  • oppgave_id: En automatisk økende unik identifikator for hver oppgave.
  • tittel: Tittelen eller navnet på oppgaven, begrenset til 255 tegn.
  • forfallsdato: Forfallsdatoen for oppgaven, representert som en dato.
  • status: Statusen til oppgaven, som kan være «Venter», «Pågår» eller «Fullført». Standardverdien er satt til «Venter».
  • ansvarlig: Den personen som er ansvarlig for den aktuelle oppgaven.

Nå som vi har opprettet oppgavetabellen, skal vi sette inn noen poster i den:

-- Sette inn flere poster i oppgavetabellen
INSERT INTO oppgaver (tittel, forfallsdato, status, ansvarlig)
VALUES
    ('Oppgave 1', '2023-08-10', 'Venter', 'John'),
    ('Oppgave 2', '2023-08-11', 'Pågår', 'Jane'),
    ('Oppgave 3', '2023-08-12', 'Fullført', 'Mike'),
    ('Oppgave 4', '2023-08-13', 'Venter', 'Alice'),
    ('Oppgave 5', '2023-08-14', 'Pågår', 'Bob'),
    ('Oppgave 6', '2023-08-15', 'Fullført', 'Emily'),
    ('Oppgave 7', '2023-08-16', 'Venter', 'David'),
    ('Oppgave 8', '2023-08-17', 'Pågår', 'Olivia'),
    ('Oppgave 9', '2023-08-18', 'Venter', 'Daniel'),
    ('Oppgave 10', '2023-08-19', 'Fullført', 'Sophia'),
    ('Oppgave 11', '2023-08-20', 'Venter', 'Matthew'),
    ('Oppgave 12', '2023-08-21', 'Pågår', 'Ava'),
    ('Oppgave 13', '2023-08-22', 'Fullført', 'William'),
    ('Oppgave 14', '2023-08-23', 'Venter', 'Ella'),
    ('Oppgave 15', '2023-08-24', 'Pågår', 'James'),
    ('Oppgave 16', '2023-08-25', 'Fullført', 'Lily'),
    ('Oppgave 17', '2023-08-26', 'Venter', 'Benjamin'),
    ('Oppgave 18', '2023-08-27', 'Pågår', 'Mia'),
    ('Oppgave 19', '2023-08-28', 'Venter', 'Henry'),
    ('Oppgave 20', '2023-08-29', 'Fullført', 'Isabella');

Når du kjører insert-kommandoen, skal du se noe lignende dette:

Query OK, 20 rows affected (0.18 sec)
Records: 20  Duplicates: 0  Warnings: 0

Kjør nå TRUNCATE table-kommandoen for å slette alle postene fra oppgavetabellen:

TRUNCATE TABLE oppgaver;
Query OK, 0 rows affected (0.72 sec)

Dette fjerner alle poster, men ikke tabellen. Du kan bekrefte dette ved å kjøre SHOW TABLES; som dette:

SHOW TABLES;
+---------------+
| Tables_in_db1 |
+---------------+
| oppgaver      |
+---------------+
1 row in set (0.00 sec)

Og en SELECT-spørring for å hente data fra oppgavetabellen vil returnere et tomt sett:

SELECT * FROM oppgaver;
Empty set (0.00 sec)

Hvordan bruke SQL DELETE-kommandoen

Syntaks for SQL DELETE-kommandoen

Den generelle syntaksen for å bruke SQL DELETE-kommandoen er som følger:

DELETE FROM tabellnavn 
WHERE betingelse;

Betingelsen i WHERE-leddet er det predikatet som avgjør hvilke av radene som skal slettes. DELETE-kommandoen sletter alle rader der predikatet er sant.

DELETE-kommandoen gir deg derfor mer kontroll over hvilke poster som skal slettes.

Men hva skjer når du bruker DELETE-kommandoen uten WHERE-leddet? 🤔

DELETE FROM tabellnavn;

Å kjøre DELETE-kommandoen som vist over sletter alle radene i databasetabellen.

Hvis en DELETE-kommando eller et sett med DELETE-kommandoer er en del av en ikke-committed transaksjon, kan du rulle tilbake endringene. Det anbefales likevel å sikkerhetskopiere dataene dine andre steder.

Eksempel på bruk av SQL DELETE

La oss se hvordan SQL DELETE-kommandoen fungerer i praksis.

Vi har slettet alle postene fra oppgavetabellen. Derfor kan du kjøre INSERT-kommandoen på nytt (som vi kjørte tidligere) for å sette inn poster:

-- Sette inn flere poster i oppgavetabellen
INSERT INTO oppgaver (tittel, forfallsdato, status, ansvarlig)
VALUES
    ('Oppgave 1', '2023-08-10', 'Venter', 'John'),
    ('Oppgave 2', '2023-08-11', 'Pågår', 'Jane'),
    ('Oppgave 3', '2023-08-12', 'Fullført', 'Mike'),
    ...
    ('Oppgave 18', '2023-08-27', 'Pågår', 'Mia'),
    ('Oppgave 19', '2023-08-28', 'Venter', 'Henry'),
    ('Oppgave 20', '2023-08-29', 'Fullført', 'Isabella');

La oss først bruke DELETE-kommandoen med WHERE-leddet. Følgende spørring sletter alle radene som har statusen «Fullført»:

DELETE FROM oppgaver WHERE status="Fullført";
Query OK, 6 rows affected (0.14 sec)

Kjør nå denne SELECT-spørringen:

SELECT * FROM oppgaver;

Du vil se at det er 14 rader igjen:

+-----------+-----------+------------+-------------+------------+
| oppgave_id | tittel     | forfallsdato| status      | ansvarlig  |
+-----------+-----------+------------+-------------+------------+
|          1 | Oppgave 1  | 2023-08-10 | Venter      | John       |
|          2 | Oppgave 2  | 2023-08-11 | Pågår      | Jane       |
|          4 | Oppgave 4  | 2023-08-13 | Venter      | Alice      |
|          5 | Oppgave 5  | 2023-08-14 | Pågår      | Bob        |
|          7 | Oppgave 7  | 2023-08-16 | Venter      | David      |
|          8 | Oppgave 8  | 2023-08-17 | Pågår      | Olivia     |
|          9 | Oppgave 9  | 2023-08-18 | Venter      | Daniel     |
|         11 | Oppgave 11 | 2023-08-20 | Venter      | Matthew    |
|         12 | Oppgave 12 | 2023-08-21 | Pågår      | Ava        |
|         14 | Oppgave 14 | 2023-08-23 | Venter      | Ella       |
|         15 | Oppgave 15 | 2023-08-24 | Pågår      | James      |
|         17 | Oppgave 17 | 2023-08-26 | Venter      | Benjamin   |
|         18 | Oppgave 18 | 2023-08-27 | Pågår      | Mia        |
|         19 | Oppgave 19 | 2023-08-28 | Venter      | Henry      |
+-----------+-----------+------------+-------------+------------+
14 rows in set (0.00 sec)

Ved å kjøre følgende DELETE-kommando slettes alle de resterende 14 postene i tabellen:

DELETE FROM oppgaver;
Query OK, 14 rows affected (0.20 sec)

Og oppgavetabellen er nå tom:

SELECT * FROM oppgaver;
Empty set (0.00 sec)

SQL DROP-kommandoen

Så langt har vi lært at:

  • TRUNCATE-kommandoen sletter alle radene fra tabellen.
  • DELETE-kommandoen – uten et WHERE-ledd – sletter alle postene fra tabellen.

TRUNCATE- og DELETE-kommandoene sletter imidlertid ikke tabellen. Hvis du ønsker å slette tabellen fra databasen, kan du bruke kommandoen DROP TABLE slik:

DROP TABLE tabellnavn;

La oss nå slette oppgavetabellen fra databasen:

mysql> DROP TABLE oppgaver;
Query OK, 0 rows affected (0.43 sec)

Du vil se at SHOW TABLES; returnerer et tomt sett (siden vi har slettet den eneste tabellen som fantes i databasen):

mysql> SHOW TABLES;
Empty set (0.00 sec)

Når du bør bruke TRUNCATE vs. DELETE i SQL

Funksjon TRUNCATE DELETE
Syntaks TRUNCATE TABLE tabellnavn; Med WHERE-ledd: DELETE FROM tabellnavn WHERE betingelse;
Uten WHERE-ledd: DELETE TABLE tabellnavn;
SQL Delsett Data-definisjonsspråk (DDL) Datamanipulasjonsspråk (DML)
Effekt Sletter alle radene i databasetabellen. Når den kjøres uten WHERE-leddet, sletter DELETE-kommandoen alle postene i databasetabellen.
Ytelse Mer effektiv enn DELETE-kommandoen når du arbeider med store tabeller. Mindre effektiv enn TRUNCATE-kommandoen.

Oppsummert:

  • Når du trenger å slette alle radene fra en stor databasetabell, bruk TRUNCATE-kommandoen.
  • For å slette et utvalg av radene basert på spesifikke forhold, bruk DELETE-kommandoen.

Oppsummering

La oss avslutte diskusjonen med en oppsummering:

  • Når du arbeider med databasetabeller, kan det hende du må fjerne et utvalg av rader eller alle radene i en bestemt tabell. For å gjøre det kan du bruke TRUNCATE- eller DELETE-kommandoene.
  • TRUNCATE-kommandoen har følgende syntaks: TRUNCATE TABLE tabellnavn;. Den sletter alle radene i tabellen som er angitt med tabellnavn, men sletter ikke selve tabellen.
  • DELETE-kommandoen har følgende syntaks: DELETE FROM tabellnavn WHERE betingelse;. Dette fjerner radene der predikatbetingelsen er sann.
  • Å kjøre SQL DELETE-kommandoen uten WHERE-leddet sletter alle radene i tabellen. Så funksjonelt sett oppnår dette det samme som SQL TRUNCATE-kommandoen.
  • TRUNCATE er spesielt raskere når du arbeider med større tabeller, siden den ikke skanner hele tabellen. Så når du trenger å slette alle radene i en stor databasetabell, kan det være mer effektivt å bruke TRUNCATE.
  • Når du trenger å slette et utvalg av rader – basert på en spesifikk betingelse – kan du bruke SQL DELETE-kommandoen.

For en rask oversikt over vanlige SQL-kommandoer, ta en titt på dette SQL-juksearket.