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.