Quelle est la différence entre TRUNCATE et DELETE en SQL?
Question
Quelle est la différence entre TRUNCATE
et DELETE
en SQL?
Si votre réponse est spécifique à la plate-forme, veuillez l'indiquer.
La solution
Voici une liste de différences. J'ai mis en évidence les fonctionnalités spécifiques à Oracle et j'espère que la communauté pourra également ajouter la différence spécifique des autres fournisseurs. Les différences communes à la plupart des fournisseurs peuvent aller directement sous les en-têtes, les différences étant soulignées ci-dessous.
Présentation générale
Si vous souhaitez supprimer rapidement toutes les lignes d'une table et que vous êtes vraiment sûr de vouloir le faire, et que vous ne disposez pas de clés étrangères dans les tables, alors TRUNCATE sera probablement plus rapide. qu'un DELETE.
Différents problèmes spécifiques au système doivent être pris en compte, comme détaillé ci-dessous.
Type d'instruction
Supprimer est DML, Truncate est DDL ( Qu'est-ce que DDL et DML? )
Valider et annuler
Variable par fournisseur
SQL * Server
Troncature peut être annulée.
PostgreSQL
Troncature peut être annulée.
Oracle
Etant donné que TRUNCATE est un fichier DDL, il implique deux validations, une avant et une après l’exécution de l’instruction. Truncate ne peut donc pas être annulé et un échec dans le processus de troncature aura quand même généré un commit.
Cependant, voir Flashback ci-dessous.
Récupération d'espace
Supprimer ne récupère pas d'espace, Truncate récupère de l'espace
Oracle
Si vous utilisez la clause REUSE STORAGE, les segments de données ne sont pas désalloués, ce qui peut être légèrement plus efficace si la table doit être rechargée avec des données. La limite supérieure est réinitialisée.
Portée de la ligne
Supprimer peut être utilisé pour supprimer toutes les lignes ou seulement un sous-ensemble de lignes. Truncate supprime toutes les lignes.
Oracle
Quand une table est partitionnée, les partitions individuelles peuvent être tronquées isolément, ainsi une suppression partielle de toutes les données de la table est possible.
Types d'objet
Supprimer peut être appliqué aux tables et aux tables à l'intérieur d'un cluster. Troncature ne s'applique qu'aux tables ou à la totalité du cluster. (Peut être spécifique à Oracle)
Identité d'objet de données
Oracle
La suppression n'affecte pas l'ID d'objet de données, mais tronquer affecte un nouvel id d'objet de données à moins que il n'y ait jamais eu d'insertion dans la table depuis sa création. Même une seule insertion annulée entraînera un nouvel identifiant d'objet de données à affecter lors de la troncature.
Flashback (Oracle)
Le flashback fonctionne avec les suppressions, mais une troncature empêche le flashback aux états antérieurs à l'opération.
Cependant, à partir de 11gR2, la fonctionnalité FLASHBACK ARCHIVE le permet, sauf dans Express Edition
Utilisation de FLASHBACK dans Oracle http://docs.oracle.com/cd/ E11882_01 / appdev.112 / e41502 / adfns_flashback.htm # ADFNS638
Privilèges
Variable
Oracle
La suppression peut être accordée sur une table à un autre utilisateur ou rôle, mais ne peut être tronqué sans l'aide d'un droit DROP ANY TABLE.
Rétablir / Annuler
Supprimer génère une petite quantité de répétition et une grande quantité d'annulation. Truncate génère une quantité négligeable de chacun.
Index
Oracle
Une opération de tronquage rend les index inutilisables utilisables à nouveau. Supprimer ne le fait pas.
Clés étrangères
Une troncature ne peut pas être appliquée lorsqu'une clé étrangère activée fait référence à la table. Le traitement avec suppression dépend de la configuration des clés étrangères.
Verrouillage de la table
Oracle
Truncate nécessite un verrou de table exclusif, et delete nécessite un verrou de table partagé. Désactiver les verrous de table est donc un moyen d’empêcher les opérations tronquées sur une table.
Déclencheurs
Les déclencheurs DML ne se déclenchent pas sur un fichier tronqué.
Oracle
Les déclencheurs DDL sont disponibles.
Exécution à distance
Oracle
La troncature ne peut pas être émise via un lien de base de données.
Colonnes d'identité
SQL * Server
Truncate réinitialise la séquence pour les types de colonne IDENTITY, la suppression ne le fait pas.
Jeu de résultats
Dans la plupart des implémentations, une instruction DELETE
peut renvoyer au client les lignes supprimées.
par exemple. dans un sous-programme Oracle PL / SQL, vous pouvez:
DELETE FROM employees_temp
WHERE employee_id = 299
RETURNING first_name,
last_name
INTO emp_first_name,
emp_last_name;
Autres conseils
La différence entre tronquer et supprimer est listée ci-dessous:
+----------------------------------------+----------------------------------------------+
| Truncate | Delete |
+----------------------------------------+----------------------------------------------+
| We can't Rollback after performing | We can Rollback after delete. |
| Truncate. | |
| | |
| Example: | Example: |
| BEGIN TRAN | BEGIN TRAN |
| TRUNCATE TABLE tranTest | DELETE FROM tranTest |
| SELECT * FROM tranTest | SELECT * FROM tranTest |
| ROLLBACK | ROLLBACK |
| SELECT * FROM tranTest | SELECT * FROM tranTest |
+----------------------------------------+----------------------------------------------+
| Truncate reset identity of table. | Delete does not reset identity of table. |
+----------------------------------------+----------------------------------------------+
| It locks the entire table. | It locks the table row. |
+----------------------------------------+----------------------------------------------+
| Its DDL(Data Definition Language) | Its DML(Data Manipulation Language) |
| command. | command. |
+----------------------------------------+----------------------------------------------+
| We can't use WHERE clause with it. | We can use WHERE to filter data to delete. |
+----------------------------------------+----------------------------------------------+
| Trigger is not fired while truncate. | Trigger is fired. |
+----------------------------------------+----------------------------------------------+
| Syntax : | Syntax : |
| 1) TRUNCATE TABLE table_name | 1) DELETE FROM table_name |
| | 2) DELETE FROM table_name WHERE |
| | example_column_id IN (1,2,3) |
+----------------------------------------+----------------------------------------------+
DROP
La commande DROP supprime une table de la base de données. Toutes les lignes, les index et les privilèges des tables seront également supprimés. Aucun déclencheur DML ne sera déclenché. L'opération ne peut pas être annulée.
TRUNCATE
TRUNCATE supprime toutes les lignes d'une table. L'opération ne peut pas être annulée et aucun déclencheur ne sera déclenché. En tant que tel, TRUCATE est plus rapide et n’utilise pas autant d’espace annulé qu’un DELETE.
SUPPRIMER
La commande DELETE est utilisée pour supprimer des lignes d'une table. Une clause WHERE peut être utilisée pour ne supprimer que certaines lignes. Si aucune condition WHERE n'est spécifiée, toutes les lignes seront supprimées. Après avoir effectué une opération DELETE, vous devez COMMIT ou ROLLBACK la transaction pour rendre la modification permanente ou l'annuler. Notez que cette opération déclenchera tous les déclencheurs DELETE de la table.
De: http://www.orafaq.com/faq/difference_between_troupate_truncate_delete_and_dropete_d >
Toutes les bonnes réponses, auxquelles je dois ajouter:
Puisque TRUNCATE TABLE
est une DDL ( langage de définition de données ). , pas une DML ( Langauge de manipulation de données ), la Supprimer les déclencheurs
ne cours pas.
Résumé de Delete Vs Truncate dans SQL Server
Pour l'article complet, suivez ce lien: http: // codaffection .com / sql-server-article / delete-vs-truncate-in-sql-server /
Tiré de l'article de la dotnet mob: Delete Vs Truncate dans SQL Server
Avec SQL Server ou MySQL, s'il existe une clé PK avec incrémentation automatique, truncate réinitialisera le compteur.
"Truncate ne consigne rien". est correct. J'irais plus loin:
Truncate n'est pas exécuté dans le contexte d'une transaction.
L’avantage de la vitesse par rapport à la suppression par la vitesse devrait être évident. Cet avantage varie de trivial à énorme, selon votre situation.
Cependant, j'ai constaté que tronquer involontairement rompre l'intégrité référentielle et violer d'autres contraintes. Le pouvoir que vous gagnez en modifiant des données en dehors d’une transaction doit être mis en balance avec la responsabilité dont vous héritez lorsque vous marchez sur la corde raide sans filet.
Oui, DELETE est plus lent, TRUNCATE est plus rapide. Pourquoi?
DELETE doit lire les enregistrements, vérifier les contraintes, mettre à jour le bloc, mettre à jour les index et générer des répétitions / annulations. Tout cela prend du temps.
TRUNCATE ajuste simplement un pointeur dans la base de données pour la table (High Water Mark) et poof! les données sont parties.
Ceci est spécifique à Oracle, autant que je sache.
TRUNCATE
est l'instruction DDL alors que DELETE
est une instruction DML. Vous trouverez ci-dessous les différences entre les deux:
-
Comme
TRUNCATE
est un DDL ( Langage de définition des données ), il n’est pas nécessaire de s’engager pour rendre les modifications permanentes. Et c’est la raison pour laquelle les lignes supprimées par tronqué ne peuvent pas être restaurées. D'autre part,DELETE
est un DML ( langage de manipulation de données ). Cette instruction nécessite donc une validation explicite pour rendre son effet permanent. -
TRUNCATE
supprime toujours toutes les lignes d'une table, laissant la table vide et la structure de la table intacte, alors queDELETE
peut supprimer conditionnellement si la clause where est utilisée . -
Les lignes supprimées par l'instruction
TRUNCATE TABLE
ne peuvent pas être restaurées et vous ne pouvez pas spécifier la clause where dans l'instructionTRUNCATE
.
Les instructions -
TRUNCATE
ne déclenchent pas les déclencheurs, contrairement au déclencheur de suppression de l'instructionDELETE
Voici le très bon lien pertinent pour le sujet.
Si vous avez accidentellement supprimé toutes les données de la table à l’aide de Supprimer / Tronquer. Vous pouvez annuler une transaction validée. Restaurez la dernière sauvegarde et exécutez le journal des transactions jusqu'au moment où supprimer / tronquer est sur le point de se produire.
Les informations connexes ci-dessous proviennent de un article de blog :
Pendant que nous travaillons sur la base de données, nous utilisons les fonctions Supprimer et Tronquer sans connaître les différences entre eux. Dans cet article, nous allons discuter la différence entre Delete et Truncate in Sql.
Supprimer:
- Supprimer est une commande DML.
- L'instruction de suppression est exécutée à l'aide d'un verrou de ligne. Chaque ligne du tableau est verrouillée pour la suppression.
- Nous pouvons spécifier des filtres dans la clause where.
- Il supprime les données spécifiées si la condition existe.
- Supprimez un déclencheur d'activités, car l'opération est journalisée individuellement.
- Plus lent que Truncate car il conserve les journaux
Troncature
- Truncate est une commande DDL.
- La table tronquée verrouille toujours la table et la page, mais pas chaque ligne.Elle supprime toutes les données.
- Impossible d'utiliser la condition Where.
- Cela supprime toutes les données.
- La table Truncate ne peut pas activer de déclencheur car l'opération n'enregistre pas les suppressions de lignes individuelles.
- Plus rapide en termes de performances, car il ne conserve aucun journal.
Remarque: Supprimer et tronquer peuvent être annulés s’ils sont utilisés avec Transaction. Si la transaction est faite, les moyens engagés alors nous ne pouvons pas rollback Truncate, mais on peut toujours annuler la commande Delete depuis les fichiers journaux, car delete write les enregistre dans le fichier journal au cas où il serait nécessaire pour revenir à l'avenir à partir des fichiers journaux.
Si vous avez une contrainte de clé étrangère faisant référence à la table, vous êtes en essayant de tronquer, cela ne fonctionnera pas même si la table de renvoi n'a pas les données qu'il contient. En effet, la vérification de la clé étrangère est effectuée avec DDL. plutôt que DML. Ceci peut être contourné en désactivant temporairement le contrainte (s) de clé étrangère à la table.
Supprimer la table est une opération journalisée. Donc, la suppression de chaque ligne devient enregistré dans le journal des transactions, ce qui le ralentit. Table tronquée supprime également toutes les lignes d'une table, mais il n'enregistre pas la suppression de chaque ligne, à la place, il enregistre la désallocation des pages de données du table, ce qui le rend plus rapide.
~ Si vous avez supprimé accidentellement toutes les données de la table à l'aide de Supprimer / tronquer. Vous pouvez annuler une transaction validée. Restaurer le dernière sauvegarde et exécution du journal des transactions jusqu'au moment où Supprimer / Tronquer est sur le point d'arriver.
Dans SQL Server 2005, je pense que vous pouvez annuler une troncature
.TRUNCATE peut être annulé s'il est encapsulé dans une transaction.
Veuillez consulter les deux références ci-dessous et tester vous-même: -
TRUNCATE vs. DELETE est l’une des questions les plus connues au cours des entretiens SQL. Assurez-vous simplement de l'expliquer correctement à l'intervieweur, sinon le travail pourrait vous coûter cher. Le problème, c’est que peu d’entre eux sont au courant et qu’ils jugeront donc probablement la réponse fausse si vous leur dites que YES Truncate peut être annulé.
SUPPRIMER
La commande DELETE est utilisée pour supprimer des lignes d'une table. Une clause WHERE peut être utilisée pour ne supprimer que certaines lignes. Si aucune condition WHERE n'est spécifiée, toutes les lignes seront supprimées. Après avoir effectué une opération DELETE, vous devez COMMIT ou ROLLBACK la transaction pour rendre la modification permanente ou l'annuler. Notez que cette opération déclenchera tous les déclencheurs DELETE de la table.
TRUNCATE
TRUNCATE supprime toutes les lignes d'une table. L'opération ne peut pas être annulée et aucun déclencheur ne sera déclenché. En tant que tel, TRUCATE est plus rapide et n'utilise pas autant d'espace d'annulation qu'un DELETE.
DROP
La commande DROP supprime une table de la base de données. Toutes les lignes, les index et les privilèges des tables seront également supprimés. Aucun déclencheur DML ne sera déclenché. L'opération ne peut pas être annulée.
DROP et TRUNCATE sont des commandes DDL, alors que DELETE est une commande DML. Par conséquent, les opérations DELETE peuvent être annulées (annulées), alors que les opérations DROP et TRUNCATE ne peuvent pas être annulées.
De: http://www.orafaq.com/faq/difference_berner_between_truncate_donne p>
Une petite correction à la réponse originale - supprimer génère également une quantité importante de répétition (annulation étant elle-même protégée par répétition). Ceci peut être vu à partir de la sortie de traçage automatique:
SQL> delete from t1;
10918 rows deleted.
Elapsed: 00:00:00.58
Execution Plan
----------------------------------------------------------
0 DELETE STATEMENT Optimizer=FIRST_ROWS (Cost=43 Card=1)
1 0 DELETE OF 'T1'
2 1 TABLE ACCESS (FULL) OF 'T1' (TABLE) (Cost=43 Card=1)
Statistics
----------------------------------------------------------
30 recursive calls
12118 db block gets
213 consistent gets
142 physical reads
3975328 redo size
441 bytes sent via SQL*Net to client
537 bytes received via SQL*Net from client
4 SQL*Net roundtrips to/from client
2 sorts (memory)
0 sorts (disk)
10918 rows processed
Voici ma réponse détaillée sur la différence entre DELETE et TRUNCATE dans SQL. Serveur
& # 8226; Supprimer les données : vous pouvez utiliser les deux pour supprimer les lignes de la table.
Mais un DELETE peut être utilisé pour supprimer les lignes non seulement d'une table mais également d'une VIEW ou du résultat d'un OPENROWSET ou d'OPENQUERY en fonction des capacités du fournisseur.
& # 8226; Clause FROM : avec DELETE, vous pouvez également supprimer les lignes d'une table / vue / rowset_function_limited en fonction des lignes d'une autre table à l'aide d'une autre clause FROM. Dans cette clause FROM, vous pouvez également écrire des conditions JOIN normales. En fait, vous pouvez créer une instruction DELETE à partir d’une instruction SELECT qui ne contient aucune fonction d’agrégat en remplaçant SELECT par DELETE et en supprimant les noms de colonne.
Avec TRUNCATE, vous ne pouvez pas faire cela.
& # 8226; WHERE : un TRUNCATE ne peut pas avoir de conditions WHERE, mais un DELETE le peut. Cela signifie que vous ne pouvez pas supprimer une ligne ou un groupe de lignes spécifique avec TRUNCATE. TRUNCATE TABLE est similaire à l’instruction DELETE sans clause WHERE.
& # 8226; Performances : TRUNCATE TABLE est plus rapide et utilise moins de ressources système et de journal des transactions. Et l'une des raisons est les verrous utilisés par les deux déclarations. L'instruction DELETE est exécutée à l'aide d'un verrou de ligne. Chaque ligne de la table est verrouillée pour la suppression. TRUNCATE TABLE verrouille toujours la table et la page, mais pas chaque ligne.
& # 8226; Journal des transactions : l'instruction DELETE supprime les lignes une par une et crée des entrées individuelles dans le journal des transactions pour chaque ligne.
TRUNCATE TABLE supprime les données en libérant les pages de données utilisées pour stocker les données de la table et enregistre uniquement les désallocations de pages dans le journal des transactions.
& # 8226; Pages : après l'exécution d'une instruction DELETE, la table peut toujours contenir des pages vides. TRUNCATE supprime les données en libérant les pages de données utilisées pour stocker les données de la table.
& # 8226; Déclencheur : TRUNCATE n'active pas les déclencheurs de suppression de la table. Vous devez donc faire très attention lorsque vous utilisez TRUNCATE. Il ne faut jamais utiliser un TRUNCATE si delete Trigger est défini sur la table pour effectuer une action de nettoyage ou de journalisation automatique lorsque des lignes sont supprimées.
& # 8226; Colonne d'identité : avec TRUNCATE si la table contient une colonne d'identité, le compteur de cette colonne est réinitialisé sur la valeur de départ définie pour la colonne. Si aucune graine n'a été définie, la valeur par défaut 1 est utilisée. DELETE ne réinitialise pas le compteur d’identité. Donc, si vous voulez conserver le compteur d'identité, utilisez plutôt DELETE.
& # 8226; Réplication : DELETE peut être utilisé dans les tables utilisées dans la réplication transactionnelle ou la réplication de fusion.
Bien que TRUNCATE ne puisse pas être utilisé sur les tables impliquées dans la réplication transactionnelle ou la réplication de fusion.
& # 8226; Annulation : l'instruction DELETE peut être annulée.
TRUNCATE peut également être annulé à condition qu’il soit inclus dans un bloc TRANSACTION et que la session ne soit pas fermée. Une fois la session fermée, vous ne pourrez plus annuler TRUNCATE.
& # 8226; Restrictions : L'instruction DELETE peut échouer si elle enfreint un déclencheur ou tente de supprimer une ligne référencée par les données d'une autre table avec une contrainte FOREIGN KEY. Si DELETE supprime plusieurs lignes et que l'une des lignes supprimées enfreint un déclencheur ou une contrainte, l'instruction est annulée, une erreur est renvoyée et aucune ligne n'est supprimée.
Et si DELETE est utilisé contre View, cette vue doit être une vue pouvant être mise à jour.
TRUNCATE ne peut pas être utilisé par rapport à la table utilisée dans la vue indexée.
TRUNCATE ne peut pas être utilisé sur la table référencée par une contrainte FOREIGN KEY, sauf si une table a une clé étrangère qui se référence elle-même.
La plus grande différence réside dans le fait que tronquer est une opération non journalisée, alors que la suppression l’est.
Cela signifie simplement qu'en cas de blocage de la base de données, vous ne pouvez pas récupérer les données sur lesquelles truncate est exploitée, mais vous pouvez le supprimer.
Plus de détails ici
Instruction DELETE: cette commande supprime uniquement les lignes de la table en fonction de la condition donnée dans la clause where ou supprime toutes les lignes de la table si aucune condition n'est spécifiée. Mais cela ne libère pas l’espace contenant la table.
La syntaxe d'une instruction SQL DELETE est la suivante:
DELETE FROM nom_table [condition WHERE];
Instruction TRUNCATE: cette commande permet de supprimer toutes les lignes de la table et de libérer l'espace contenant la table.
SUPPRIMER
DELETE is a DML command DELETE you can rollback Delete = Only Delete- so it can be rolled back In DELETE you can write conditions using WHERE clause Syntax – Delete from [Table] where [Condition]
TRUNCATE
TRUNCATE is a DDL command You can't rollback in TRUNCATE, TRUNCATE removes the record permanently Truncate = Delete+Commit -so we can't roll back You can't use conditions(WHERE clause) in TRUNCATE Syntax – Truncate table [Table]
Pour plus de détails, visitez
http://www.zilckh.com / quelle-est-la-difference-entre-truncate-and-delete /
Une autre différence entre les deux opérations est que si la table contient une colonne d’identité, le compteur de cette colonne est réinitialisé à 1 (ou à la valeur initiale définie pour la colonne) sous TRUNCATE. DELETE n'a pas cet effet.
En bref, tronquer n'enregistre rien (donc c'est beaucoup plus rapide mais ne peut pas être annulé) alors que supprimer est enregistré (et peut faire partie d'une transaction plus importante, sera annulé, etc.). Si vous avez des données que vous ne voulez pas dans une table de dev, il est généralement préférable de les tronquer, car vous ne courez pas le risque de remplir le journal des transactions.
Une des principales raisons pour laquelle cela est pratique est lorsque vous devez actualiser les données dans une table de plusieurs millions de lignes, sans vouloir la reconstruire. " Supprimer * " prendrait une éternité, alors que l’impact de Truncate sur la performance serait négligeable.
Impossible de créer un fichier DDL sur un lien texte.
Je voudrais commenter le post de matthieu, mais je n'ai pas encore le représentant ...
Sous MySQL, le compteur d'incrémentation automatique est réinitialisé avec tronquer, mais pas avec delete.
Ce n’est pas que tronquer ne consigne rien dans SQL Server. Truncate ne consigne aucune information mais consigne la page de désallocation de données pour la table sur laquelle vous avez déclenché TRUNCATE.
et un enregistrement tronqué peuvent être annulés si nous définissons une transaction au début et que nous pouvons récupérer l’enregistrement tronqué après l’avoir annulé. Mais vous ne pouvez pas récupérer les enregistrements tronqués à partir de la sauvegarde du journal des transactions après une transaction tronquée validée.
Truncate peut également être annulé ici, à l'exemple
begin Tran
delete from Employee
select * from Employee
Rollback
select * from Employee
Tronquer et Supprimer en SQL sont deux commandes utilisées pour supprimer ou supprimer des données de la table. Bien que de nature assez basique, les deux commandes SQL peuvent créer beaucoup de problèmes jusqu'à ce que vous soyez familiarisé avec les détails avant de les utiliser. Un choix incorrect de commande peut entraîner un processus très lent ou même détruire le segment de journal si trop de données doivent être supprimées et si le segment de journal ne suffit pas. C’est pourquoi il est essentiel de savoir quand utiliser les commandes truncate et delete en SQL, mais avant de les utiliser, vous devez connaître les différences entre Truncate et Delete et nous en tenir compte pour déterminer quand DELETE est la meilleure option pour la suppression. data ou TRUNCATE doivent être utilisés pour purger les tables.
Voir chèque cliquez ici
En émettant une instruction TRUNCATE TABLE, vous demandez à SQL Server de supprimer tous les enregistrements d'une table, sans que la journalisation ou le traitement de la transaction ait lieu.
L'instruction DELETE peut avoir une clause WHERE pour supprimer des enregistrements spécifiques alors que l'instruction TRUNCATE n'en nécessite aucun et efface la totalité de la table. Il est important de noter que l’instruction DELETE consigne la date de suppression, contrairement à l’instruction TRUNCATE.
Une autre différence spécifique au serveur SQL de Microsoft réside dans le fait que delete
permet d'utiliser l'instruction output
pour suivre les enregistrements supprimés, par exemple:
delete from [SomeTable]
output deleted.Id, deleted.Name
Vous ne pouvez pas faire cela avec tronquer
.
Truncate est utilisée pour réinitialiser la table. Il s'agit d'une commande DDL qui supprime toutes les lignes de la table. Attendu que DELETE est une commande DML utilisée supprimer une ligne ou un ensemble de lignes selon certaines conditions. Si aucune condition n'est spécifiée, cette commande supprimera toutes les lignes de la table.