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.