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 på 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 på 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.