sql >> Database teknologi >  >> RDS >> Database

SQL DELETE for begyndere

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.


  1. Hvordan bruger man Oracle ORDER BY og ROWNUM korrekt?

  2. Sammenlign to MySQL-databaser

  3. NLS_COLLATION_ID() Funktion i Oracle

  4. Sammenkæd flere rækker i et array med SQL på PostgreSQL