Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Différence entre DELETE et TRUNCATE Table dans SQL Server

De nombreux articles ont été écrits pour décrire la différence entre les instructions SQL DELETE et SQL TRUNCATE. De plus, c'est l'une des questions les plus fréquentes lors des entretiens d'embauche. Les deux instructions suppriment les données de la table. Cependant, il existe aussi des différences.

Cet article se concentrera sur ces différences et les illustrera avec des exemples pratiques.

Le résumé des différences entre supprimer et tronquer

Instruction Tronquer la table instruction DELETE
Supprime tous les enregistrements de la table. Nous ne pouvons pas appliquer la clause WHERE pour supprimer des enregistrements spécifiques. Supprime tous les enregistrements et peut appliquer la clause WHERE pour supprimer des enregistrements spécifiques.
Ne déclenche pas la DELETE déclencheur. Exécute la DELETE déclencheur.
Réinitialise la valeur d'identité. Ne réinitialise pas la valeur d'identité.
Est plus rapide en raison de l'utilisation minimale du journal des transactions. Est plus lent en raison de l'exécution d'une analyse initiale de la table pour compter le nombre de lignes à supprimer et de la suppression des lignes une par une. Les modifications sont consignées dans les journaux de transactions.
Utilise le verrou au niveau de la ligne. Utilise le verrou au niveau de la table.
Ne peut pas être utilisé avec des vues indexées. Peut être utilisé avec des vues indexées.
Nécessite la ALTER TABLE autorisation. Nécessite la SUPPRIMER permission sur la table.

À des fins de démonstration, j'ai créé une table nommée studentDB . Là, j'ai fait deux tables, tblSchool et tblStudent , et inséré des enregistrements dans les deux tables.

Le script suivant crée le tblStudent tableau :

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

Ce script crée le tblSchool tableau :

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

Le script suivant insère des données dans tblStudent tableau :

/*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

Le script ci-dessous insère des données dans tblSchool tableau :

insert into [dbo].[tblSchool] ([school_name], [city]) 
values 
('Nalanda School','Mehsana'),
('Sarvajanik School','Mehsana')

Maintenant, identifions les différences entre les déclarations.

Différence 1 :Supprimer les données

La commande DELETE permet de supprimer des enregistrements spécifiques/tous les enregistrements de la table. L'instruction TRUNCATE supprime toutes les données.

Nous allons explorer ce scénario.

SUPPRIMER l'instruction

Pour supprimer des enregistrements spécifiques avec DELETE, nous pouvons utiliser la clause WHERE dans la requête. Supposons que nous voulions supprimer certains étudiants du tblstudent table, le code de l'élève est ST002 .

Ajoutez le filtre dans l'instruction DELETE comme suit :

Delete from  tblstudent where student_code='ST002'

Cette requête supprimera un seul enregistrement de la table.

Une fois l'enregistrement supprimé, exécutez la commande select requête pour afficher les données :

Select * from tblstudent

Instruction TRUNCATE TABLE

Dans la table tronquée, l'ajout de la clause WHERE est impossible.

La requête suivante supprime tous les enregistrements de tblStudent tableau :

Truncate table tblStudent

Différence 2 :déclencheurs

Lorsque nous exécutons la commande DELETE, le serveur SQL invoque les déclencheurs DELETE.

J'ai créé un déclencheur nommé trgdeleteStudent sur tblStudent . Lorsque nous exécutons une instruction DELETE sur le tblstudent table, le déclencheur insère un enregistrement dans un tblDeletedStudent tableau.

Le code T-SQL pour créer tbldeletedStudent est le suivant :

CREATE TABLE [dbo].[tblDelatedStudents]
(
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[Student_Code] [varchar](10) NULL,
	CONSTRAINT [PK_tblDelatedStudents] PRIMARY KEY CLUSTERED ([ID] ASC)
)

Le code T-SQL ci-dessous crée le déclencheur :

create TRIGGER trgdeleteStudent on [tblStudent]
FOR DELETE 
AS 
INSERT INTO [dbo].[tblDelatedStudents](student_code)
  SELECT student_code
FROM DELETED;
GO

Exécutez la requête ci-dessous pour supprimer l'enregistrement de l'étudiant ST0001 :

delete from tblstudent where student_code='ST001'

Exécutez la requête suivante pour vérifier :

select * from [dbo].[tblDelatedStudents]

Comme vous pouvez le voir dans la capture d'écran ci-dessus, un enregistrement a été ajouté au tableau.

Maintenant, exécutons l'instruction TRUNCATE TABLE pour supprimer les données de tblstudent tableau :

Truncate table [dbo].[tblDelatedStudents]

Vérifiez les données en interrogeant tblDeletedStudent :

select * from [dbo].[tblDelatedStudents]

Comme vous pouvez le voir, les enregistrements n'ont pas été insérés dans la table tblDeletedStudent .Ainsi, le trgdeletestudiant la gâchette ne s'est pas déclenchée.

Différence 3 :Réinitialiser les valeurs d'identité

Lorsque nous exécutons la commande DELETE, les valeurs d'identité ne seront pas réinitialisées aux valeurs initiales. Pour l'exécution de l'instruction de table TRUNCATE, la valeur d'identité sera réinitialisée.

SUPPRIMER l'instruction

Exécutez l'instruction DELETE ci-dessous pour supprimer les données de tblStudent tableau :

delete from tblStudent where student_code='ST004'

Ensuite, exécutez la requête d'insertion suivante pour ajouter des enregistrements au tblStudent le tableau :

insert into [dbo].[tblStudent] ([student_name],[student_code],[student_grade],[SchoolID]) 
values 
('Ramesh Upadhyay','ST007','B',2)
Go

Exécutez la requête suivante pour afficher les données de tblStudent :

select * from [dbo].[tblStudent]

L'image ci-dessus montre que la valeur initiale de la colonne d'identité est incrémentée de un.

TRUNCATE TABLE

Exécutez l'instruction TRUNCATE TABLE ci-dessous pour supprimer les données de tblStudent tableau :

Truncate table [dbo].[tblStudents]

Une fois les données supprimées, insérez des enregistrements dans le tableau :

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

Exécutez la requête SELECT pour afficher les données :

select * from [dbo].[tblStudent]

Comme vous pouvez le voir dans l'image ci-dessus, la valeur d'identité a été réinitialisée.

Différence 4 :Autorisations

Pour supprimer des données à l'aide de l'instruction DELETE, nous devons disposer de l'autorisation DELETE sur la table.

Pour supprimer les données à l'aide de l'instruction TRUNCATE TABLE, nous avons besoin de l'autorisation ALTER TABLE.

SUPPRIMER l'instruction

J'ai créé un utilisateur nommé testuser1 et attribué l'autorisation SUPPRIMER sur le tblStudent tableau.

Nous supprimons le dossier de l'étudiant avec student_code=ST001 :

use StudentDB
go
delete from tblstudent where student_code='ST001'

Exécutez la sélection requête pour afficher les données :

Il a supprimé l'enregistrement de la table.

TRUNCATE TABLE

Maintenant, exécutez TRUNCATE TABLE pour supprimer les données :

use StudentDB
go
truncate table tblstudent

La requête renvoie l'erreur suivante :

Msg 1088, Level 16, State 7, Line 3
Cannot find the object "tblstudent" because it does not exist or you do not have permissions
.

Pour rectifier cela, nous devons attribuer la permission ALTER TABLE .

Exécutez la requête suivante pour accorder l'accès à testuser1 sur le tblStudent tableau :

grant ALTER on tblstudent to testuser1

Réexécutez l'instruction truncate table :

use StudentDB
go
truncate table tblstudent

Afficher les données du tableau :

Les données ont été supprimées du tableau.

Résumé

Cet article explique les différences entre l'instruction SQL DELETE et l'instruction SQL TRUNCATE TABLE. Nous avons défini toutes les fonctionnalités essentielles et les avons illustrées avec des exemples.