Er zijn veel artikelen geschreven om het verschil tussen de SQL DELETE- en SQL TRUNCATE-instructies te beschrijven. Bovendien is het een van de meest gestelde vragen tijdens sollicitatiegesprekken. Beide instructies verwijderen de gegevens uit de tabel. Er zijn echter ook verschillen.
Dit artikel gaat in op deze verschillen en illustreert ze met praktische voorbeelden.
De samenvatting van de verschillen Verwijderen versus afkappen
Truncate Table-instructie | DELETE-instructie |
Verwijdert alle records uit de tabel. We kunnen de WHERE-clausule niet toepassen om specifieke records te verwijderen. | Verwijdert alle records en kan de WHERE-component toepassen om specifieke records te verwijderen. |
De DELETE . wordt niet geactiveerd trigger. | Voert de VERWIJDEREN . uit trigger. |
Reset de identiteitswaarde. | Reset de identiteitswaarde niet. |
Is sneller door minimaal gebruik van het transactielogboek. | Is langzamer vanwege het uitvoeren van een eerste tabelscan om het aantal te verwijderen rijen te tellen en rijen één voor één te verwijderen. De wijzigingen worden vastgelegd in transactielogboeken. |
Gebruikt de vergrendeling op rijniveau. | Gebruikt de vergrendeling op tafelniveau. |
Kan niet worden gebruikt met geïndexeerde weergaven. | Kan worden gebruikt met geïndexeerde weergaven. |
Vereist de ALTER TABLE toestemming. | Vereist de VERWIJDEREN toestemming op de tafel. |
Voor demonstratiedoeleinden heb ik een tabel gemaakt met de naam studentDB . Daar heb ik twee tabellen gemaakt, tblSchool en tblStudent , en enkele records in beide tabellen ingevoegd.
Het volgende script maakt de tblStudent tafel:
CREATE TABLE [dbo].[tblStudent](
[ID] [int] IDENTITY(1,1) NOT NULL,
[student_name] [varchar](250) NOT NULL,
[student_code] [varchar](5) NOT NULL,
[student_grade] [char](2) NOT NULL,
[SchoolID] [int] NOT NULL,
CONSTRAINT [PK_tblStudent] PRIMARY KEY CLUSTERED
( [ID] ASC))
GO
ALTER TABLE [dbo].[tblStudent] WITH CHECK ADD CONSTRAINT [FK_tblStudent_tblSchool] FOREIGN KEY([SchoolID])
REFERENCES [dbo].[tblSchool] ([School_ID])
GO
ALTER TABLE [dbo].[tblStudent] CHECK CONSTRAINT [FK_tblStudent_tblSchool]
GO
Dit script maakt de tblSchool tafel:
CREATE TABLE [dbo].[tblSchool](
[School_ID] [int] IDENTITY(1,1) NOT NULL,
[School_Name] [varchar](500) NULL,
[City] [varchar](50) NULL,
CONSTRAINT [PK_tblSchool] PRIMARY KEY CLUSTERED
([School_ID] ASC)) ON [PRIMARY]
GO
Het volgende script voegt gegevens in de tblStudent . in tafel:
/*Insert Data in tblStudent*/
insert into [dbo].[tblStudent] ([student_name],[student_code],[student_grade],[SchoolID])
values
('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
Het onderstaande script voegt gegevens in de tblSchool tafel:
insert into [dbo].[tblSchool] ([school_name], [city])
values
('Nalanda School','Mehsana'),
('Sarvajanik School','Mehsana')
Laten we nu de verschillen tussen de uitspraken identificeren.
Verschil 1:de gegevens verwijderen
De opdracht DELETE werkt om specifieke/alle records uit de tabel te verwijderen. De TRUNCATE-instructie verwijdert alle gegevens.
We zullen dit scenario onderzoeken.
VERWIJDEREN Verklaring
Om specifieke records met DELETE te verwijderen, kunnen we de WHERE-component in de query gebruiken. Stel dat we enkele studenten willen verwijderen uit de tblstudent tabel, is de code van de leerling ST002 .
Voeg het filter als volgt toe aan de DELETE-instructie:
Delete from tblstudent where student_code='ST002'
Met deze zoekopdracht wordt slechts één record uit de tabel verwijderd.
Nadat de record is verwijderd, voert u de select vraag om de gegevens te bekijken:
Select * from tblstudent
TRUNCATE TABLE-instructie
In de truncate-tabel is het onmogelijk om de WHERE-component toe te voegen.
De volgende query verwijdert alle records uit de tblStudent tafel:
Truncate table tblStudent
Verschil 2:Triggers
Wanneer we het DELETE-commando uitvoeren, roept de SQL Server de DELETE-triggers aan.
Ik heb een trigger gemaakt met de naam trgdeleteStudent op tblStudent . Wanneer we een DELETE-instructie uitvoeren op de tblstudent tabel, voegt de trigger een record in een tblDeletedStudent tafel.
De T-SQL-code om tbldeletedStudent te maken is het volgende:
CREATE TABLE [dbo].[tblDelatedStudents]
(
[ID] [int] IDENTITY(1,1) NOT NULL,
[Student_Code] [varchar](10) NULL,
CONSTRAINT [PK_tblDelatedStudents] PRIMARY KEY CLUSTERED ([ID] ASC)
)
De onderstaande T-SQL-code creëert de trigger:
create TRIGGER trgdeleteStudent on [tblStudent]
FOR DELETE
AS
INSERT INTO [dbo].[tblDelatedStudents](student_code)
SELECT student_code
FROM DELETED;
GO
Voer de onderstaande query uit om het record van de leerling ST0001 . te verwijderen :
delete from tblstudent where student_code='ST001'
Voer de volgende query uit om te verifiëren:
select * from [dbo].[tblDelatedStudents]
Zoals je kunt zien in de bovenstaande schermafbeelding, is er een record aan de tabel toegevoegd.
Laten we nu de instructie TRUNCATE TABLE uitvoeren om de gegevens uit de tblstudent te verwijderen tafel:
Truncate table [dbo].[tblDelatedStudents]
Controleer de gegevens door tblDeletedStudent . op te vragen :
select * from [dbo].[tblDelatedStudents]
Zoals je kunt zien, zijn de records niet ingevoegd in de tblDeletedStudent-tabel .Dus de trgdeletestudent trigger is niet afgegaan.
Verschil 3:De identiteitswaarden resetten
Wanneer we de opdracht DELETE uitvoeren, worden de identiteitswaarden niet teruggezet naar de oorspronkelijke waarden. Voor de uitvoering van de TRUNCATE-tabelinstructie wordt de identiteitswaarde opnieuw ingesteld.
VERWIJDEREN Verklaring
Voer de onderstaande DELETE-instructie uit om de gegevens van de tblStudent . te verwijderen tafel:
delete from tblStudent where student_code='ST004'
Voer vervolgens de volgende query invoegen uit om records toe te voegen aan de tblStudent de tafel:
insert into [dbo].[tblStudent] ([student_name],[student_code],[student_grade],[SchoolID])
values
('Ramesh Upadhyay','ST007','B',2)
Go
Voer de volgende query uit om de gegevens van tblStudent . te bekijken :
select * from [dbo].[tblStudent]
De bovenstaande afbeelding laat zien dat de initiële identiteitskolomwaarde met één wordt verhoogd.
TABEL AFKOPPEN
Voer de onderstaande TRUNCATE TABLE-instructie uit om de gegevens uit de tblStudent te verwijderen tafel:
Truncate table [dbo].[tblStudents]
Nadat de gegevens zijn verwijderd, voegt u records in de tabel in:
insert into [dbo].[tblStudent] ([student_name],[student_code],[student_grade],[SchoolID])
values
('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
Voer de SELECT-query uit om de gegevens te bekijken:
select * from [dbo].[tblStudent]
Zoals je kunt zien in de bovenstaande afbeelding, is de identiteitswaarde opnieuw ingesteld.
Verschil 4:machtigingen
Om gegevens te verwijderen met behulp van de DELETE-instructie, moeten we de DELETE-machtiging voor de tabel hebben.
Om de gegevens te verwijderen met behulp van de TRUNCATE TABLE-instructie, hebben we de ALTER TABLE-toestemming nodig.
VERWIJDEREN Verklaring
Ik heb een gebruiker aangemaakt met de naam testuser1 en de machtiging VERWIJDEREN toegewezen aan de tblStudent tafel.
We verwijderen het record van de leerling met student_code=ST001 :
use StudentDB
go
delete from tblstudent where student_code='ST001'
Voer de select . uit vraag om gegevens te bekijken:
Het heeft het record van de tafel verwijderd.
TABEL AFKOPPEN
Voer nu de TRUNCATE TABLE uit om de gegevens te verwijderen:
use StudentDB
go
truncate table tblstudent
De query retourneert de volgende fout:
Msg 1088, Level 16, State 7, Line 3
Cannot find the object "tblstudent" because it does not exist or you do not have permissions
.
Om dit te corrigeren, moeten we de ALTER TABLE-toestemming toewijzen .
Voer de volgende query uit om toegang te verlenen aan testuser1 op de tblStudent tafel:
grant ALTER on tblstudent to testuser1
Voer de instructie voor het afkappen van de tabel opnieuw uit:
use StudentDB
go
truncate table tblstudent
Bekijk de gegevens uit de tabel:
De gegevens zijn uit de tabel verwijderd.
Samenvatting
In dit artikel worden de verschillen uitgelegd tussen de SQL DELETE-instructie en de SQL TRUNCATE TABLE-instructie. We hebben alle essentiële kenmerken gedefinieerd en geïllustreerd met voorbeelden.