Den här artikeln innehåller grundläggande SQL DELETE
uttalanden som nybörjare kan använda för att radera data från sina databastabeller.
Ta bort en enstaka rad
Här är ett grundläggande exempel på SQL DELETE
uttalande.
DELETE FROM Owners
WHERE OwnerId = 5;
I det här fallet tar vi bort raden där OwnerId
kolumnen har värdet 4
.
DELETE
uttalande börjar med DELETE FROM
, följt av tabellnamnet (dvs tabellen som innehåller data du vill radera).
I vissa databashanteringssystem (DBMS) är FROM
nyckelordet är valfritt, men det är en bra idé att inkludera det för bättre portabilitet (om du behöver köra samma kod på ett annat DBMS).
Du bör alltid inkludera en WHERE
sats, om du inte vill ta bort alla rader från tabellen.
Ja, du läste rätt. Utelämnar WHERE
klausul kommer att ta bort alla rader i tabellen.
De flesta DBMS har flera andra alternativ som du kan använda med DELETE
uttalande, men de som listas här är de mest använda.
Observera att DELETE
uttalandet tar bort hela raden. Du kan inte ta bort värdet för en enskild kolumn inom en rad. För att göra detta, använd SQL UPDATE
uttalande.
Exempel
I det här exemplet tar vi bort data från en tabell.
Låt oss först och främst se vad som 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, låt oss ta bort ägare nummer 5 och välj sedan 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 att den sista raden har raderats som specificerat.
Främmande nycklar
Du kan få ett felmeddelande om du försöker ta bort data som refereras av en främmande nyckel i en annan tabell. Detta beror på att tabellen du försöker ta bort data från är den överordnade tabellen i en relation. Tabellen med den främmande nyckeln (den underordnade tabellen) förlitar sig på data i den överordnade tabellen (d.v.s. data som du försöker ta bort).
Om du får ett felmeddelande eller inte beror på hur den främmande nyckeln konfigurerades. De flesta DBMS stöder olika alternativ för att hantera denna situation. Sådana alternativ kan inkludera att skapa ett fel, kaskad raderingen till tabellen för främmande nyckel (dvs. radera raden från den underordnade tabellen), ställa in den främmande nyckeln till NULL
, eller ställ in det till dess standardvärde.
Här är ett exempel på hur du försöker ta bort en rad som refereras till av en främmande nyckel.
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 det här fallet uppstod ett fel och raden raderades inte.
I det här exemplet visas Owners.OwnerId
kolumn är den primära nyckeln i denna tabell. En annan tabell som heter Pets
har ett OwnerId
kolumn som refererar till den här primärnyckelkolumnen, och i det här fallet finns det minst en rad som refererar till ägare nummer 3.
Om jag verkligen ville ta bort den här raden skulle jag behöva uppdatera data i den underordnade tabellen så att inga rader pekar på den här ägaren. Antingen det, eller modifiera den främmande nyckeln så att den använder ett annat alternativ när raderingsoperationer sker på primärnyckeln. Att ändra en främmande nyckel kan vara ett oönskat alternativ, beroende på vad du behöver göra. Beroende på ditt DBMS kan det också kräva att du släpper den befintliga nyckeln och återskapar den.
I vilket fall som helst är det här felet bra, eftersom det uppmärksammar oss på ett problem som vi kommer att få om vi tar bort den här raden. Det hjälper till att upprätthålla referensintegritet.
Varning! Att glömma WHERE
Klausul
DELETE
uttalande kan vara ett mycket farligt uttalande. Om du utelämnar WHERE
klausul kommer du att ta bort alla rader i tabellen.
Som tur är kan du bli räddad av främmande nyckelbegränsningar om du försöker ta bort data från den överordnade tabellen för en relation.
Men tänk om det inte är det. Vad händer om inga fel uppstår av dina raderingssatser?
Låt oss ta reda på!
Låt oss köra en annan DELETE
uttalande, men den här gången glömmer vi att inkludera WHERE
klausul. Den här gången kör vi det också mot en tabell som inte är en förälder i ett förhållande.
Låt oss först se vad som 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 | +---------+-------------+-----------+-----------+------------+
Okej, så vi har åtta husdjur. Vi kan faktiskt se att tre husdjur ägs av ägare nummer 3 – ägaren som vi försökte ta bort i föregående exempel. Det är därför vi fick felet.
Hur som helst, låt oss köra vår DELETE
sats utan WHERE
klausul, kontrollera sedan tabellen igen
DELETE FROM Pets;
SELECT * FROM Pets;
Resultat:
(8 rows affected) (0 rows affected)
(8 rows affected)
del betyder att åtta rader raderades.
(0 rows affected)
del betyder att inga rader har markerats (eftersom det inte finns några rader i tabellen.
Hoppsan!
Det kan finnas tillfällen då du faktiskt behöver ta bort alla rader i tabellen. Beroende på bordets storlek är detta uttalande allt du behöver.
Om du behöver ta bort en större tabell finns det även TRUNCATE TABLE
, som tar bort alla rader från en tabell eller specificerade partitioner av en tabell, utan att logga de enskilda radraderingarna (DELETE
uttalande loggar dessa raderingar).
Därför TRUNCATE TABLE
är snabbare och använder färre system- och transaktionsloggresurser.
Exempel på användning av TRUNCATE TABLE
:
TRUNCATE TABLE Owners;
Observera att detta kanske inte fungerar om tabellen refereras av en främmande nyckelrestriktion, även om det inte finns några underordnade rader. I sådana fall DELETE
kanske fungerar istället.