sql >> Database >  >> RDS >> Sqlserver

Verschil tussen DELETE en TRUNCATE-tabel in SQL Server

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.


  1. Hoe Kubernetes te installeren met Kubeadm

  2. SQL NIET IN werkt niet

  3. INSERT-instructie in Oracle

  4. IF-THEN-ELSE-instructies in postgresql