Denne artikel indeholder grundlæggende SQL DELETE
sætninger, som begyndere kan bruge til at slette data fra deres databasetabeller.
Slet en enkelt række
Her er et grundlæggende eksempel på SQL DELETE
erklæring.
DELETE FROM Owners
WHERE OwnerId = 5;
I dette tilfælde sletter vi rækken med OwnerId
kolonne har en værdi på 4
.
DELETE
sætning starter med DELETE FROM
, efterfulgt af tabelnavnet (dvs. den tabel, der indeholder de data, du vil slette).
I nogle databasestyringssystemer (DBMS'er) er FROM
søgeord er valgfrit, men det er en god idé at inkludere det for bedre portabilitet (i tilfælde af at du skal køre den samme kode på en anden DBMS).
Du bør altid inkludere en WHERE
klausul, medmindre du vil slette alle rækker fra tabellen.
Ja, du læste rigtigt. Udeladelse af WHERE
klausul vil slette alle rækker i tabellen.
De fleste DBMS'er har forskellige andre muligheder, som du kan bruge med DELETE
sætning, men dem, der er anført her, er de mest almindeligt anvendte.
Bemærk, at DELETE
statement sletter hele rækken. Du kan ikke slette værdien af en individuel kolonne i en række. For at gøre dette skal du bruge SQL UPDATE
erklæring.
Eksempel
I dette eksempel sletter vi data fra en tabel.
Lad os først og fremmest se, hvad der står i tabellen.
SELECT * FROM Owners;
Resultat:
+-----------+-------------+------------+----------------+-------------------+ | OwnerId | FirstName | LastName | Phone | Email | |-----------+-------------+------------+----------------+-------------------| | 1 | Homer | Connery | (308) 555-0100 | [email protected] | | 2 | Bart | Pitt | (231) 465-3497 | [email protected] | | 3 | Nancy | Stallone | (489) 591-0408 | NULL | | 4 | Boris | Biden | (349) 611-8908 | [email protected] | | 5 | Woody | Eastwood | (308) 555-0112 | [email protected] | +-----------+-------------+------------+----------------+-------------------+
OK, lad os slette ejer nummer 5, og vælg derefter tabellen igen.
DELETE FROM Owners
WHERE OwnerId = 5;
SELECT * FROM Owners;
Resultat:
+-----------+-------------+------------+----------------+-------------------+ | OwnerId | FirstName | LastName | Phone | Email | |-----------+-------------+------------+----------------+-------------------| | 1 | Homer | Connery | (308) 555-0100 | [email protected] | | 2 | Bart | Pitt | (231) 465-3497 | [email protected] | | 3 | Nancy | Stallone | (489) 591-0408 | NULL | | 4 | Boris | Biden | (349) 611-8908 | [email protected] | +-----------+-------------+------------+----------------+-------------------+
Vi kan se, at den sidste række er blevet slettet som angivet.
Udenlandske nøgler
Du får muligvis en fejl, hvis du forsøger at slette data, der refereres til af en fremmednøgle i en anden tabel. Dette skyldes, at den tabel, du forsøger at slette data fra, er den overordnede tabel i en relation. Tabellen med den fremmede nøgle (den underordnede tabel) er afhængig af data i den overordnede tabel (dvs. data, som du forsøger at slette).
Om du får en fejl eller ej, afhænger af, hvordan den fremmede nøgle blev konfigureret. De fleste DBMS'er understøtter forskellige muligheder for at håndtere denne situation. Sådanne muligheder kan omfatte, at rejse en fejl, kaskadere sletningen til fremmednøgletabellen (dvs. sletning af rækken fra den underordnede tabel), indstilling af fremmednøglen til NULL
, eller indstille den til standardværdien.
Her er et eksempel på forsøg på at slette en række, der refereres til af en fremmednøgle.
DELETE FROM Owners
WHERE OwnerId = 3;
Resultat:
Msg 547, Level 16, State 0, Line 1 The DELETE statement conflicted with the REFERENCE constraint "FK_Pets_Owners". The conflict occurred in database "PetHotel", table "dbo.Pets", column 'OwnerId'. The statement has been terminated.
I dette tilfælde blev der rejst en fejl, og rækken blev ikke slettet.
I dette eksempel er Owners.OwnerId
kolonne er den primære nøgle i denne tabel. En anden tabel kaldet Pets
har et OwnerId
kolonne, der refererer til denne primære nøglekolonne, og i dette tilfælde er der mindst én række, der refererer til ejer nummer 3.
Hvis jeg virkelig ville slette denne række, skulle jeg opdatere data i den underordnede tabel, så ingen rækker peger på denne ejer. Enten det, eller modificer fremmednøglen, så den bruger en anden mulighed, når der sker sletningsoperationer på den primære nøgle. Ændring af en fremmednøgle kan være en uønsket mulighed, afhængigt af hvad du skal gøre. Afhængigt af dit DBMS kan det også kræve, at du slipper den eksisterende nøgle og genskaber den.
Under alle omstændigheder er denne fejl en god ting, fordi den advarer os om et problem, som vi vil have, hvis vi sletter denne række. Det hjælper med at håndhæve referentiel integritet.
Forsigtig! Glemmer WHERE
Klausul
DELETE
udtalelse kan være en meget farlig udtalelse. Hvis du udelader WHERE
klausul, vil du slette alle rækker i tabellen.
Heldigvis kan du blive reddet af fremmednøglebegrænsninger, hvis du forsøger at slette data fra en relations overordnede tabel.
Men hvad hvis det ikke er. Hvad hvis der ikke er nogen fejl i dine sletteudsagn?
Lad os finde ud af det!
Lad os køre endnu en DELETE
erklæring, men denne gang glemmer vi at inkludere WHERE
klausul. Denne gang kører vi det også mod en tabel, der ikke er en forælder i et forhold.
Lad os først se, hvad der står i tabellen.
SELECT * FROM Pets;
Resultat:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+
OK, så vi har otte kæledyr. Vi kan faktisk se, at tre kæledyr ejes af ejer nummer 3 – ejeren vi forsøgte at slette i det forrige eksempel. Det er derfor, vi fik fejlen.
Uanset hvad, lad os gå videre og køre vores DELETE
sætning uden WHERE
klausul, og tjek derefter tabellen igen
DELETE FROM Pets;
SELECT * FROM Pets;
Resultat:
(8 rows affected) (0 rows affected)
(8 rows affected)
del betyder, at otte rækker blev slettet.
(0 rows affected)
del betyder, at der ikke er valgt rækker (fordi der ikke er nogen rækker i tabellen.
Ups!
Der kan være tidspunkter, hvor du rent faktisk har brug for at slette alle rækker i tabellen. Afhængigt af bordets størrelse vil denne erklæring være alt, hvad du behøver.
Hvis du har brug for at slette en større tabel, er der også TRUNCATE TABLE
, som fjerner alle rækker fra en tabel eller specificerede partitioner af en tabel uden at logge de enkelte rækkesletninger (DELETE
erklæring logger disse sletninger).
Derfor TRUNCATE TABLE
er hurtigere og bruger færre system- og transaktionslogressourcer.
Eksempel på brug af TRUNCATE TABLE
:
TRUNCATE TABLE Owners;
Bemærk, at dette muligvis ikke virker, hvis tabellen refereres af en fremmednøglebegrænsning, selvom der ikke er nogen underordnede rækker. I sådanne tilfælde DELETE
kan virke i stedet for.