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

Forskellen mellem DELETE og TRUNCATE tabel i SQL Server

Der er skrevet mange artikler for at beskrive forskellen mellem SQL DELETE- og SQL TRUNCATE-sætningerne. Desuden er det et af de mest almindelige spørgsmål under jobsamtaler. Begge udsagn fjerner dataene fra tabellen. Der er dog også forskelle.

Denne artikel vil fokusere på disse forskelle og illustrere dem med praktiske eksempler.

Oversigt over forskelle Slet vs Truncate

Trunker tabeludsagn DELETE-erklæring
Sletter alle poster fra tabellen. Vi kan ikke anvende WHERE-klausulen til at fjerne specifikke poster. Fjerner alle poster og kan anvende WHERE-sætningen for at slette specifikke poster.
Udløser ikke SLET trigger. Udfører SLET trigger.
Nulstiller identitetsværdien. Nulstiller ikke identitetsværdien.
Er hurtigere på grund af minimal brug af transaktionsloggen. Er langsommere på grund af at udføre en indledende tabelscanning for at tælle antallet af rækker, der skal slettes og fjerne rækker én efter én. Ændringerne logges i transaktionslogfiler.
Bruger rækkeniveaulåsen. Bruger låsen på tabelniveau.
Kan ikke bruges med indekserede visninger. Kan bruges med indekserede visninger.
Kræver ALTERTABELLEN tilladelse. Kræver SLET tilladelse på bordet.

Til demonstrationsformål har jeg lavet en tabel med navnet studentDB . Der har jeg lavet to borde, tblSchool og tblStudent , og indsatte nogle poster i begge tabeller.

Følgende script opretter tblStudent tabel:

OPRET TABEL [dbo].[tblStudent]( [ID] [int] IDENTITY(1,1) NOT NULL, [student_name] [varchar](250) NOT NULL, [student_code] [varchar]( 5) IKKE NULL, [student_grade] [char](2) NOT NULL, [Skole-ID] [int] IKKE NULL, BEGRÆNSNING [PK_tblStudent] PRIMÆR NØGLE KLYNGET ( [ID] ASC))MÅLTABEL [dbo].[tblStudent] MED KONTROLLER TILFØJ BEGRÆNSNING [FK_tblStudent_tblSchool] UDENLANDSKE NØGLE([Skole-ID])REFERENCER [dbo].[tblSkole] ([Skole_ID])MÅLTABEL [dbo].[tblStudent] KONTROLLER BEGRÆNSNING [FK_tblStudent_tblSkole]GO 

Dette script opretter tblSchool tabel:

OPRET TABEL [dbo].[tblSkole]( [Skole-ID] [int] IDENTITET(1,1) IKKE NULL, [Skolenavn] [varchar](500) NULL, [By] [varchar](50) ) NULL,BEGRÆNSNING [PK_tblSchool] PRIMÆR NØGLE KLYNGET ([School_ID] ASC)) PÅ [PRIMARY]GO 

Følgende script indsætter data i tblStudent tabel:

/*Indsæt data i tblStudent*/insert into [dbo].[tblStudent] ([elev_navn],[elev_kode],[student_grade],[Skole-ID]) værdier ('Nisarg Upadhyay','ST001' ,'A',1),('Nirali Upadhyay','ST002','B',1),('Dixit Upadhyay','ST003','A',1),('Bharti Upadhyay','ST004 ','C',2),('Nimesh Patel','ST005','C',2),('Raghav Dave','ST006','A',1)Go

Nedenstående script indsætter data i tblSchool tabel:

indsæt i [dbo].[tblSchool] ([skolenavn], [by]) værdier ('Nalanda School','Mehsana'),('Sarvajanik School','Mehsana') 

Lad os nu identificere forskellene mellem udsagnene.

Forskel 1:Sletning af data

Kommandoen DELETE virker til at fjerne specifikke/alle poster fra tabellen. TRUNCATE-sætningen sletter alle data.

Vi vil undersøge dette scenarie.

SLET erklæring

For at fjerne specifikke poster med DELETE kan vi bruge WHERE-sætningen i forespørgslen. Antag, at vi ønsker at slette nogle elever fra tblstudent tabel, er elevens kode ST002 .

Tilføj filteret i DELETE-sætningen som følger:

Slet fra tblstudent hvor student_code='ST002' 

Denne forespørgsel vil kun slette én post fra tabellen.

Når posten er slettet, skal du køre vælg forespørgsel for at se dataene:

Vælg * fra tblstudent 

TRUNCATE TABLE Statement

I trunkeringstabellen er det umuligt at tilføje WHERE-sætningen.

Følgende forespørgsel fjerner alle poster fra tblStudent tabel:

Trunker tabel tblStudent 

Forskel 2:Udløsere

Når vi kører kommandoen DELETE, aktiverer SQL Serveren DELETE-triggerne.

Jeg har oprettet en trigger ved navn trgdeleteStudent tblStudent . Når vi udfører en DELETE-sætning på tblstudent tabel, indsætter triggeren en post i en tblDeleted Student tabel.

T-SQL-koden til at oprette tbldeletedStudent er følgende:

OPRET TABEL [dbo].[tblDelated Students]( [ID] [int] IDENTITY(1,1) NOT NULL, [Student_Code] [varchar](10) NULL, CONSTRAINT [PK_tblDelated Students] PRIMÆR NØGLE KLUSTERET ( [ID] ASC)) 

Nedenstående T-SQL-kode skaber triggeren:

opret TRIGGER trgdeleteStudent på [tblStudent]FOR SLET SOM INDSÆT I [dbo].[tblDelatedStudents](student_code) SELECT student_codeFROM DELETED;GO 

Kør nedenstående forespørgsel for at slette posten for eleven ST0001 :

slet fra tblstudent hvor student_code='ST001' 

Kør følgende forespørgsel for at bekræfte:

vælg * fra [dbo].[tblDelatedStudents] 

Som du kan se på ovenstående skærmbillede, er en post blevet tilføjet til tabellen.

Lad os nu køre TRUNCATE TABLE-sætningen for at fjerne dataene fra tblstudent tabel:

Trunker tabel [dbo].[tblDelatedStudents] 

Bekræft dataene ved at forespørge tblDeletedStudent :

vælg * fra [dbo].[tblDelatedStudents] 

Som du kan se, er posterne ikke blevet indsat i tabellen tblDeletedStudent .Således er trgdeletestudent udløseren udløste ikke.

Forskel 3:Nulstilling af identitetsværdierne

Når vi udfører kommandoen DELETE, nulstilles identitetsværdierne ikke til de oprindelige værdier. For udførelse af TRUNCATE tabelsætningen nulstilles identitetsværdien.

SLET erklæring

Kør nedenstående DELETE-sætning for at slette dataene fra tblStudent tabel:

slet fra tblStudent where student_code='ST004' 

Udfør derefter følgende indsæt forespørgsel for at tilføje poster til tblStudent tabellen:

indsæt i [dbo].[tblStudent] ([elev_navn],[elev_kode],[elev_grad],[Skole-id]) værdier ('Ramesh Upadhyay','ST007','B',2)Go  

Kør følgende forespørgsel for at se data for tblStudent :

vælg * fra [dbo].[tblStudent] 

Ovenstående billede viser, at den oprindelige identitetskolonneværdi øges med én.

TRUNCATE TABEL

Kør nedenstående TRUNCATE TABLE-sætning for at slette dataene fra tblStudent tabel:

Trunker tabel [dbo].[tblStudenter] 

Når data er slettet, skal du indsætte poster i tabellen:

indsæt i [dbo].[tblStudent] ([elev_navn],[elev_kode],[elev_grad],[Skole-id]) værdier ('Nisarg Upadhyay','ST001','A',1), ('Nirali Upadhyay','ST002','B',1),('Dixit Upadhyay','ST003','A',1),('Bharti Upadhyay','ST004','C',2) ,('Nimesh Patel','ST005','C',2),('Raghav Dave','ST006','A',1)Go 

Kør SELECT-forespørgslen for at se dataene:

vælg * fra [dbo].[tblStudent] 

Som du kan se på billedet ovenfor, er identitetsværdien blevet nulstillet.

Forskel 4:Tilladelser

For at fjerne data ved hjælp af DELETE-sætningen skal vi have DELETE-tilladelsen på bordet.

For at fjerne data ved hjælp af TRUNCATE TABLE-sætningen kræver vi ALTER TABLE-tilladelsen.

SLET erklæring

Jeg har oprettet en bruger ved navn testuser1 og tildelt SLET-tilladelsen til tblStudenten tabel.

Vi sletter elevens post med student_code=ST001 :

brug StudentDBgodelete fra tblstudent hvor student_code='ST001' 

Kør vælg forespørgsel for at se data:

Det slettede posten fra tabellen.

TRUNCATE TABEL

Kør nu TRUNCATE TABLE for at slette dataene:

brug StudentDBgotruncate table tblstudent 

Forespørgslen returnerer følgende fejl:

Besked 1088, niveau 16, tilstand 7, linje 3. Kan ikke finde objektet "tblstudent", fordi det ikke eksisterer, eller du ikke har tilladelser. 

For at rette op på dette skal vi tildele ALTER TABLE-tilladelsen .

Kør følgende forespørgsel for at give adgang til testuser1 tblStudent tabel:

tildel ALTER på tblstudent til testuser1 

Kør afkortningstabelsætningen igen:

brug StudentDBgotruncate table tblstudent 

Se data fra tabellen:

Dataene er blevet fjernet fra tabellen.

Oversigt

Denne artikel forklarede forskellene mellem SQL DELETE-sætningen og SQL TRUNCATE TABLE-sætningen. Vi har defineret alle de væsentlige funktioner og illustreret dem med eksempler.


  1. Hvordan UNION fungerer i PostgreSQL

  2. Postgres funktion NULL værdi for række, der refererer til NY

  3. Sådan får du maks. og min. værdier fra en tabel ved hjælp af aggregeret funktion - SQL Server / TSQL vejledning del 129

  4. Vigtig PostgreSQL-overvågning - del 3