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

De bedste måder at bruge SQL DELETE Statement i en SQL-tabel

I relationelle databaser opretter vi tabeller til at gemme data i forskellige formater. SQL Server gemmer data i et række- og kolonneformat, som har en værdi forbundet med hver datatype. Når vi designer SQL-tabeller, definerer vi datatyper såsom heltal, float, decimal, varchar og bit. For eksempel kan en tabel, der gemmer kundedata, have felter som kundenavn, e-mail, adresse, stat, land og så videre. Forskellige SQL-kommandoer udføres på en SQL-tabel og kan opdeles i følgende kategorier:

  • Data Definition Language (DDL):  Disse kommandoer bruges til at oprette og ændre databaseobjekterne i en database.
    • Opret:  Opretter objekter
    • Rediger:  Ændrer objekter
    • Slip:  Sletter objekter
    • Trunkere:  Sletter alle data fra en tabel
  • Data Manipulation Language (DML):  Disse kommandoer indsætter, henter, ændrer, sletter og opdaterer data i databasen.
    • Vælg:  Henter data fra en enkelt eller flere tabel
    • Indsæt:  Tilføjer nye data i en tabel
    • Opdatering:  Ændrer eksisterende data
    • Slet:  Sletter eksisterende poster i en tabel

  • Data Control Language (DCL):  Disse kommandoer er knyttet til rettigheder eller tilladelseskontroller i en database.
    • Tilskud:  Tildeler tilladelser til en bruger
    • Tilbagekald:  Tilbagekalder tilladelser fra en bruger
  • Transaction Control Language (TCL):  Disse kommandoer styrer transaktioner i en database.
    • Forpligtelse:  Gemmer ændringerne foretaget af forespørgslen
    • Tilbage: Ruller en eksplicit eller implicit transaktion tilbage til begyndelsen af ​​transaktionen eller til et lagringspunkt i transaktionen
    • Gem transaktioner:  Indstiller et lagringspunkt eller en markør i en transaktion

Antag, at du har kundeordredata gemt i en SQL-tabel. Hvis du blev ved med at indsætte data i denne tabel kontinuerligt, kunne tabellen indeholde millioner af poster, hvilket ville forårsage ydeevneproblemer i dine applikationer. Din indeksvedligeholdelse kan også blive ekstremt tidskrævende. Ofte behøver du ikke beholde ordrer, der er ældre end tre år. I disse tilfælde kan du slette disse poster fra tabellen. Dette ville spare lagerplads, samt reducere din vedligeholdelsesindsats.

Du kan fjerne data fra en SQL-tabel på to måder:

  • Brug af en SQL delete-sætning
  • Brug af en trunkering

Vi vil se på forskellen mellem disse SQL-kommandoer senere. Lad os først undersøge SQL delete-sætningen.

En SQL delete-sætning uden nogen betingelser

I DML-sætninger (data manipulation language) fjerner en SQL delete-sætning rækkerne fra en tabel. Du kan slette en bestemt række eller alle rækker. En grundlæggende slettesætning kræver ingen argumenter.

Lad os oprette en Orders SQL-tabel ved hjælp af nedenstående script. Denne tabel har tre kolonner [OrderID], [ProductName] og [ProductQuantity].

Create Table Orders (   OrderID int, ProductName varchar(50), ProductQuantity int )

Indsæt nogle få poster i denne tabel.

Insert into Orders values (1,'ABC books',10), (2,'XYZ',100), (3,'SQL book',50)

Antag nu, at vi vil slette tabeldataene. Du kan angive tabelnavnet for at fjerne data ved hjælp af delete-sætningen. Begge SQL-sætninger er de samme. Vi kan angive tabelnavnet fra det (valgfrie) søgeord eller angive tabelnavnet direkte efter sletningen.

Delete Orders Go Delete from Orders GO

En SQL delete-sætning med filtrerede data

Disse SQL delete-sætninger sletter alle tabellens data. Normalt fjerner vi ikke alle rækkerne fra en SQL-tabel. For at fjerne en specifik række kan vi tilføje en where-klausul med delete-sætningen. Where-sætningen indeholder filterkriterierne og bestemmer til sidst, hvilke rækker der skal fjernes.

Antag for eksempel, at vi vil fjerne ordre-id 1. Når vi tilføjer en where-klausul, tjekker SQL Server først de tilsvarende rækker og fjerner de specifikke rækker.
Delete Orders where orderid=1

Hvis where-sætningsbetingelsen er falsk, fjerner den ingen rækker. For eksempel fjernede vi den bestilte 1 fra ordretabellen. Hvis vi udfører sætningen igen, finder den ingen rækker, der opfylder where-sætningsbetingelsen. I dette tilfælde returnerer den 0 berørte rækker.

SQL slette-sætning og TOP-sætning

Du kan også bruge TOP-sætningen til at slette rækkerne. For eksempel sletter nedenstående forespørgsel de øverste 100 rækker fra ordretabellen.

Delete top (100) [OrderID] from Orders

Da vi ikke har angivet nogen 'ORDER BY', vælger den tilfældige rækker og sletter dem. Vi kan bruge Order by-klausulen til at sortere dataene og slette de øverste rækker. I nedenstående forespørgsel sorterer den [OrderID] i faldende rækkefølge og sletter den derefter fra tabellen [Ordrer].

Delete from Orders where [OrderID] In ( Select top 100 [OrderID] FROM Orders order by [OrderID] Desc )

Sletning af rækker baseret på en anden tabel

Nogle gange er vi nødt til at slette rækker baseret på en anden tabel. Denne tabel kan eksistere i den samme database eller ej.

  • Tabelopslag

Vi kan bruge tabelopslagsmetoden eller SQL join til at slette disse rækker. For eksempel ønsker vi at slette rækker fra tabellen [Ordrer], der opfylder følgende betingelse:

Den skal have tilsvarende rækker i tabellen [dbo].[Kunde].

Se på nedenstående forespørgsel, her har vi en select-sætning i where-klausulen i delete-sætningen. SQL Server henter først de rækker, der opfylder select-sætningen, og fjerner derefter disse rækker fra tabellen [Order] ved hjælp af SQL delete-sætningen.

Delete Orders where orderid in (Select orderid  from Customer)
  • SQL-tilmelding

Alternativt kan vi bruge SQL joins mellem disse tabeller og fjerne rækkerne. I nedenstående forespørgsel forbinder vi tabellerne [Ordrer]] med tabellen [Kunde]. En SQL-join fungerer altid på en fælles kolonne mellem tabellerne. Vi har en kolonne [OrderID], der forbinder begge tabeller.

DELETE Orders FROM Orders o INNER JOIN Customer c ON o.orderid=c.orderid

For at forstå ovenstående sletteerklæring, lad os se den faktiske udførelsesplan.

I henhold til udførelsesplanen udfører den en tabelscanning på begge tabeller, henter de matchende data og sletter dem fra ordretabellen.

  • Common table expression (CTE)

Vi kan også bruge et fælles tabeludtryk (CTE) til at slette rækkerne fra en SQL-tabel. Først definerer vi en CTE for at finde den række, som vi vil fjerne.

Derefter forbinder vi CTE'en med SQL-tabellordrerne og sletter rækkerne.

WITH cteOrders AS (SELECT OrderID FROM Customer WHERE CustomerID = 1 ) DELETE Orders FROM cteOrders sp INNER JOIN dbo.Orders o ON o.orderid = sp.orderid;

Påvirkninger på identitetsområdet

Identitetskolonner i SQL Server genererer unikke, sekventielle værdier for din kolonne. De bruges primært til entydigt at identificere en række i SQL-tabellen. En primær nøglekolonne er også et godt valg til et klynget indeks i SQL Server.

I nedenstående script har vi en [Medarbejder]-tabel. Denne tabel har et identitetskolonne-id.

Create Table Employee ( id int identity(1,1), [Name] varchar(50) )

Vi indsatte 50 poster i denne tabel, som genererede identitetsværdierne for id-kolonnen.

Declare @id int=1 While(@id<=50) BEGIN Insert into Employee([Name]) values('Test'+CONVERT(VARCHAR,@ID)) Set @id=@id+1 END

Hvis vi sletter nogle få rækker fra SQL-tabellen, nulstiller den ikke identitetsværdierne for de efterfølgende værdier. Lad os f.eks. slette et par rækker, der har identitetsværdier 20 til 25.

Delete from employee where id between 20 and 25

Se nu tabelposterne.

Select * from employee where id>15

Det viser hullet i identitetsværdiområdet.

SQL-sletningserklæring og transaktionsloggen

SQL-sletning logger hver rækkesletning i transaktionsloggen. Antag, at du skal slette millioner af poster fra en SQL-tabel. Du ønsker ikke at slette et stort antal poster i en enkelt transaktion, fordi det kan få din logfil til at vokse eksponentielt, og din database kan muligvis også være utilgængelig. Hvis du annullerer en transaktion i midten, kan det tage timer at fortryde en sletteopgørelse.

I dette tilfælde bør du altid slette rækker i små bidder og begå disse bidder regelmæssigt. For eksempel kan du slette en batch på 10.000 rækker ad gangen, commit den og gå til næste batch. Når SQL Server commiter chunken, kan væksten i transaktionsloggen kontrolleres.

 Bedste fremgangsmåder

  • Du bør altid foretage en sikkerhedskopi, før du sletter data.
  • SQL Server bruger som standard implicitte transaktioner og begår registreringerne uden at spørge brugeren. Som en bedste praksis bør du starte en eksplicit transaktion ved hjælp af Start Transaction. Det giver dig kontrol til at begå eller tilbageføre transaktionen. Du bør også køre hyppige sikkerhedskopiering af transaktionslogfiler, hvis din database er i fuld gendannelsestilstand.
  • Du vil slette data i små bidder for at undgå overdreven brug af transaktionslog. Det undgår også blokeringer for andre SQL-transaktioner.
  • Du bør begrænse tilladelser, så brugere ikke kan slette data. Kun de autoriserede brugere skal have adgang til at fjerne data fra en SQL-tabel.
  • Du vil køre delete-sætningen med en where-sætning. Det fjerner filtrerede data fra en SQL-tabel. Hvis din applikation kræver hyppig sletning af data, er det en god idé at nulstille identitetsværdierne med jævne mellemrum. Ellers kan du blive udsat for problemer med identitetsværdi.
  • Hvis du ønsker at tømme tabellen, er det tilrådeligt at bruge trunkeringssætningen. Truncate-sætningen fjerner alle data fra en tabel, bruger minimal transaktionslogning, nulstiller identitetsværdiområdet og er hurtigere end SQL delete-sætningen, fordi den afallokerer alle sider til tabellen med det samme.
  • Hvis du bruger fremmednøglebegrænsninger (forælder-underordnet forhold) til dine tabeller, bør du slette rækken fra en underordnet række og derefter fra den overordnede tabel. Hvis du sletter rækken fra den overordnede række, kan du også bruge muligheden for kaskade ved sletning til automatisk at slette rækken fra en undertabel. Du kan se artiklen: Slet kaskade og opdater kaskade i SQL Server fremmednøgle for yderligere indsigt.
  • Hvis du bruger den øverste sætning til at slette rækkerne, sletter SQL Server rækkerne tilfældigt. Du bør altid bruge den øverste klausul med den tilsvarende orden efter og gruppe for klausul.
  • En delete-erklæring får en eksklusiv hensigtslås på referencetabellen; Derfor kan ingen andre transaktioner ændre dataene i det tidsrum. Du kan bruge NOLOCK-tip til at læse dataene.
  • Du bør undgå at bruge tabeltip til at tilsidesætte standardlåseadfærden for SQL delete-sætningen; det bør kun bruges af erfarne DBA'er og udviklere.

Vigtige overvejelser

Der er mange fordele ved at bruge SQL delete-sætninger til at fjerne data fra en SQL-tabel, men som du kan se, kræver det en metodisk tilgang. Det er vigtigt altid at slette data i små batches og at gå frem med forsigtighed, når du sletter data fra en produktionsinstans. At have en sikkerhedskopieringsstrategi for at gendanne data på et minimum af tid er et must for at undgå nedetid eller fremtidige virkninger på ydeevnen.


  1. PostgreSQL JDBC-nulstreng taget som en bytea

  2. opdatere forespørgsel med join på to tabeller

  3. Bruger forskellige databaser forskellige navnecitater?

  4. Generer tilfældige heltal uden kollisioner