Quelle est la différence entre TRUNCATE
et DELETE
en SQL?
Si votre réponse est spécifique à la plate-forme, veuillez l'indiquer.
Quelle est la différence entre TRUNCATE
et DELETE
en SQL?
Si votre réponse est spécifique à la plate-forme, veuillez l'indiquer.
Réponses:
Voici une liste de différences. J'ai mis en évidence des fonctionnalités spécifiques à Oracle, et j'espère que la communauté pourra également ajouter la différence spécifique d'autres fournisseurs. Les différences qui sont communes à la plupart des fournisseurs peuvent aller directement sous les en-têtes, les différences étant mises en évidence ci-dessous.
Si vous voulez supprimer rapidement toutes les lignes d'une table, et vous êtes vraiment sûr de vouloir le faire, et vous n'avez pas de clés étrangères contre les tables, alors un TRUNCATE sera probablement plus rapide qu'un DELETE .
Divers problèmes spécifiques au système doivent être pris en compte, comme détaillé ci-dessous.
Supprimer est DML, tronquer est DDL ( Qu'est-ce que DDL et DML? )
Variable par fournisseur
Serveur SQL
Tronquer peut être annulé.
PostgreSQL
Tronquer peut être annulé.
Oracle
Parce qu'un TRUNCATE est 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 de toute façon émis une validation.
Cependant, voir Flashback ci-dessous.
Supprimer ne récupère pas d'espace, Tronquer récupère 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 ligne des hautes eaux est réinitialisée.
Supprimer peut être utilisé pour supprimer toutes les lignes ou seulement un sous-ensemble de lignes. Tronquer supprime toutes les lignes.
Oracle
Lorsqu'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.
La suppression peut être appliquée aux tables et aux tables d'un cluster. Tronquer s'applique uniquement aux tables ou à l'ensemble du cluster. (Peut être spécifique à Oracle)
Oracle
La suppression n'affecte pas l'ID d'objet de données, mais tronquer attribue un nouvel identifiant d'objet de données à moins qu'il n'y ait jamais eu d'insertion dans la table depuis sa création. .
Flashback fonctionne à travers les suppressions, mais un tronçon empêche le flashback aux états avant l'opération.
Cependant, à partir de 11gR2, la fonction 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
Variable
Oracle
La suppression peut être accordée sur une table à un autre utilisateur ou rôle, mais la troncature ne peut pas l'être sans l'aide d'une autorisation DROP ANY TABLE.
Supprimer génère une petite quantité de rétablissement et une grande quantité d'annulation. Tronquer génère une quantité négligeable de chacun.
Oracle
Une opération tronquée rend les index inutilisables réutilisables. Supprimer ne fonctionne pas.
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.
Oracle
Tronquer nécessite un verrou de table exclusif, la suppression nécessite un verrou de table partagé. Par conséquent, la désactivation des verrous de table est un moyen d'empêcher les opérations de troncature sur une table.
Les déclencheurs DML ne se déclenchent pas sur un tronqué.
Oracle
Les déclencheurs DDL sont disponibles.
Oracle
La troncature ne peut pas être émise via un lien de base de données.
Serveur SQL
Tronquer réinitialise la séquence des types de colonnes IDENTITY, mais pas la suppression.
Dans la plupart des implémentations, une DELETE
instruction peut renvoyer au client les lignes qui ont été supprimées.
Par exemple, dans un sous-programme Oracle PL / SQL, vous pourriez:
DELETE FROM employees_temp
WHERE employee_id = 299
RETURNING first_name,
last_name
INTO emp_first_name,
emp_last_name;
La différence entre tronquer et supprimer est répertorié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) |
+----------------------------------------+----------------------------------------------+
LAISSEZ TOMBER
La commande DROP supprime une table de la base de données. Toutes les lignes, index et 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.
TRONQUER
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, TRUNCATE est plus rapide et n'utilise pas autant d'espace d'annulation qu'un DELETE. Un verrou au niveau de la table sera ajouté lors de la troncature.
SUPPRIMER
La commande DELETE est utilisée pour supprimer des lignes d'une table. Une clause WHERE peut être utilisée pour supprimer uniquement 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 COMMITER ou ROLLBACK la transaction pour rendre la modification permanente ou l'annuler. Notez que cette opération provoquera le déclenchement de tous les déclencheurs DELETE de la table. Un verrou au niveau de la ligne sera ajouté lors de la suppression.
De: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands
Toutes les bonnes réponses, auxquelles je dois ajouter:
Étant donné qu'il TRUNCATE TABLE
s'agit d'un DDL ( Data Defination Language ), et non d'une commande DML ( Data Manipulation Langauge ), le Delete Triggers
ne s'exécute pas.
Résumé de Supprimer Vs tronquer dans le serveur SQL
Pour l'article complet, suivez ce lien: http://codaffection.com/sql-server-article/delete-vs-truncate-in-sql-server/
Tiré de l'article de dotnet mob: Supprimer Vs tronquer dans SQL Server
Avec SQL Server ou MySQL, s'il existe un PK avec incrémentation automatique, tronquer réinitialise le compteur.
DBCC CHECKIDENT (table_name, RESEED, 1)
"Tronquer n'enregistre rien" est correct. J'irais plus loin:
Tronquer n'est pas exécuté dans le contexte d'une transaction.
L'avantage de la vitesse de tronquer sur supprimer devrait être évident. Cet avantage varie de trivial à énorme, selon votre situation.
Cependant, j'ai vu tronquer involontairement briser 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.
TRUNCATE
est l'instruction DDL alors qu'elle DELETE
est une instruction DML. Voici les différences entre les deux:
Comme TRUNCATE
c'est une instruction DDL ( Data definition language ), elle ne nécessite pas de validation pour rendre les modifications permanentes. Et c'est la raison pour laquelle les lignes supprimées par troncature n'ont pas pu être annulées. D'un autre côté, DELETE
une instruction DML ( Data manipulation language ) 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 qu'elle DELETE
peut être supprimée conditionnellement si la clause where est utilisée.
Les lignes supprimées par l' TRUNCATE TABLE
instruction ne peuvent pas être restaurées et vous ne pouvez pas spécifier la clause where dans l' TRUNCATE
instruction.
TRUNCATE
les instructions ne déclenchent pas les déclencheurs par opposition au déclencheur de suppression de l' DELETE
instruction
Voici le très bon lien pertinent au sujet.
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 redo / undo. Tout cela prend du temps.
TRUNCATE ajuste simplement un pointeur dans la base de données pour la table (High Water Mark) et pouf! les données ont disparu.
Ceci est spécifique à Oracle, AFAIK.
TRONQUER
TRUNCATE La requête SQL supprime toutes les lignes d'une table, sans enregistrer les suppressions de lignes individuelles.
SUPPRIMER
Pour exécuter une file d'attente DELETE, des autorisations de suppression sont requises sur la table cible. Si vous devez utiliser une clause WHERE dans un DELETE, des autorisations de sélection sont également requises.
Si vous avez accidentellement supprimé toutes les données du tableau à l'aide de Supprimer / Tronquer. Vous pouvez annuler la transaction validée. Restaurez la dernière sauvegarde et exécutez le journal des transactions jusqu'au moment où la suppression / la troncature est sur le point de se produire.
Les informations connexes ci-dessous proviennent d' un article de blog :
Tout en travaillant sur la base de données, nous utilisons Supprimer et Tronquer sans connaître les différences entre eux. Dans cet article, nous discuterons de la différence entre Supprimer et Tronquer en 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 suppression.
- Nous pouvons spécifier des filtres dans la clause where.
- Il supprime les données spécifiées si la condition existe.
- Supprimer les activités comme déclencheur car l'opération est enregistrée individuellement.
- Plus lent que Truncate car il conserve les journaux
Tronquer
- Tronquer est une commande DDL.
- La table tronquée verrouille toujours la table et la page, mais pas chaque ligne, car elle supprime toutes les données.
- Impossible d'utiliser la condition Where.
- Il supprime toutes les données.
- La table tronquée 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: les deux éléments Supprimer et Tronquer peuvent être annulés lorsqu'ils sont utilisés avec Transaction. Si la transaction est effectuée, cela signifie que nous ne pouvons pas annuler la commande Tronquer, mais nous pouvons toujours annuler la commande Supprimer des fichiers journaux, car la suppression en écriture les enregistre dans le fichier journal au cas où il serait nécessaire de revenir à l'avenir à partir des fichiers journaux.
Si vous avez une contrainte de clé étrangère faisant référence à la table que vous essayez de tronquer, cela ne fonctionnera pas même si la table de référence ne contient aucune donnée. Cela est dû au fait que la vérification de la clé étrangère se fait avec DDL plutôt qu'avec DML. Cela peut être contourné en désactivant temporairement la ou les contraintes de clé étrangère sur la table.
Supprimer la table est une opération enregistrée. Ainsi, la suppression de chaque ligne est enregistrée dans le journal des transactions, ce qui la ralentit. La table tronquée supprime également toutes les lignes d'une table, mais elle n'enregistre pas la suppression de chaque ligne, mais enregistre la désallocation des pages de données de la table, ce qui la rend plus rapide.
~ Si vous avez accidentellement supprimé toutes les données du tableau à l'aide de Supprimer / Tronquer. Vous pouvez annuler la transaction validée. Restaurez la dernière sauvegarde et exécutez le journal des transactions jusqu'au moment où la suppression / la troncature est sur le point de se produire.
Dans SQL Server 2005, je pense que vous pouvez annuler une troncature
SUPPRIMER
La commande DELETE est utilisée pour supprimer des lignes d'une table. Une clause WHERE peut être utilisée pour supprimer uniquement 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 COMMITER ou ROLLBACK la transaction pour rendre la modification permanente ou l'annuler. Notez que cette opération provoquera le déclenchement de tous les déclencheurs DELETE de la table.
TRONQUER
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.
LAISSEZ TOMBER
La commande DROP supprime une table de la base de données. Toutes les lignes, index et 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, tandis que DELETE est une commande DML. Par conséquent, les opérations DELETE peuvent être annulées (annulées), tandis que les opérations DROP et TRUNCATE ne peuvent pas être annulées.
De: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands
TRUNCATE peut être annulé s'il est encapsulé dans une transaction.
Veuillez voir les deux références ci-dessous et testez-vous: -
TRUNCATE vs. DELETE est l'une des questions tristement célèbres lors des entretiens SQL. Assurez-vous simplement de l'expliquer correctement à l'intervieweur, sinon cela pourrait vous coûter le travail. Le problème est que peu de gens sont conscients, donc très probablement ils considéreront la réponse comme erronée si vous leur dites que OUI peut être annulé.
Une petite correction à la réponse originale - supprimer génère également des quantités importantes de rétablissement (car l'annulation est elle-même protégée par le rétablissement). Cela peut être vu à partir de la sortie de suivi 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 Server
• Supprimer les données : Tout d'abord, les deux peuvent être utilisés pour supprimer les lignes du tableau.
Mais un DELETE peut être utilisé pour supprimer les lignes non seulement d'une table mais aussi d'une vue ou du résultat d'un OPENROWSET ou OPENQUERY soumis aux capacités du fournisseur.
• Clause FROM : avec DELETE, vous pouvez également supprimer des lignes d'une table / vue / rowet_function_limited en fonction des lignes d'une autre table en utilisant 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égation en remplaçant SELECT par DELETE et en supprimant les noms de colonne.
Avec TRUNCATE, vous ne pouvez pas faire ça.
• OERE : un TRUNCATE ne peut pas avoir de conditions WHERE, mais un DELETE peut. Cela signifie qu'avec TRUNCATE, vous ne pouvez pas supprimer une ligne spécifique ou un groupe spécifique de lignes. TRUNCATE TABLE est similaire à l'instruction DELETE sans clause WHERE.
• 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 l'une ou l'autre des déclarations. L'instruction DELETE est exécutée à l'aide d'un verrou de ligne, chaque ligne du tableau est verrouillée pour suppression. TRUNCATE TABLE verrouille toujours la table et la page mais pas chaque ligne.
• 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 désallouant les pages de données utilisées pour stocker les données de table et n'enregistre que les désallocations de page dans le journal des transactions.
• Pages : après l'exécution d'une instruction DELETE, la table peut toujours contenir des pages vides. TRUNCATE supprime les données en désallouant les pages de données utilisées pour stocker les données de la table.
• Trigger : TRUNCATE n'active pas les déclencheurs de suppression sur la table. Vous devez donc être très prudent 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.
• Colonne d'identité : avec TRUNCATE si la table contient une colonne d'identité, le compteur de cette colonne est réinitialisé à 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 souhaitez conserver le compteur d'identité, utilisez plutôt SUPPRIMER.
• Réplication : DELETE peut être utilisé par rapport à la table utilisée dans la réplication transactionnelle ou la réplication de fusion.
Tandis que TRUNCATE ne peut pas être utilisé sur les tables impliquées dans la réplication transactionnelle ou la réplication de fusion.
• Rollback : l'instruction DELETE peut être annulée.
TRUNCATE peut également être annulé à condition qu'il soit enfermé dans un bloc TRANSACTION et que la session ne soit pas fermée. Une fois la session fermée, vous ne pourrez plus annuler la fonction TRUNCATE.
• Restrictions : l'instruction DELETE peut échouer si elle viole un déclencheur ou tente de supprimer une ligne référencée par des données dans une autre table avec une contrainte FOREIGN KEY. Si DELETE supprime plusieurs lignes et que l'une des lignes supprimées viole 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é contre la table référencée par une contrainte FOREIGN KEY, à moins qu'une table qui possède une clé étrangère qui se référence elle-même.
DECLARE @ai as bigint
SET @ai =IDENT_CURRENT('tablename')
TRUNCATE TABLE tablename
DBCC checkident('tablename', RESEED, @ai)
La plus grande différence est que tronquer est une opération non enregistrée alors que la suppression l'est.
Cela signifie simplement qu'en cas de panne de la base de données, vous ne pouvez pas récupérer les données exploitées par tronquer, mais avec la suppression, vous pouvez.
Plus de détails ici
Instruction DELETE: cette commande supprime uniquement les lignes de la table en fonction de la condition indiqué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:
DELETE FROM nom_table [condition WHERE];
Instruction TRUNCATE: cette commande est utilisée pour supprimer toutes les lignes de la table et 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]
TRONQUER
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/what-is-the-difference-between-truncate-and-delete/
Une autre différence des 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 de départ définie pour la colonne) sous TRUNCATE. DELETE n'a pas cet effet.
En bref, truncate n'enregistre rien (c'est donc beaucoup plus rapide mais ne peut pas être annulé) tandis que delete est enregistré (et peut faire partie d'une transaction plus importante, annulera etc.). Si vous avez des données que vous ne voulez pas dans une table en 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 grande raison pour laquelle il est pratique, c'est lorsque vous devez actualiser les données dans une table de plusieurs millions de lignes, mais que vous ne voulez pas les reconstruire. "Supprimer *" prendrait une éternité, alors que l'impact sur les performances de Truncate serait négligeable.
Impossible de faire DDL sur un dblink.
Ce n'est pas que tronquer n'enregistre rien dans SQL Server. truncate n'enregistre aucune information mais il enregistre la désallocation de la page de données pour la table sur laquelle vous avez tiré TRUNCATE.
et l'enregistrement tronqué peut être annulé si nous définissons la transaction au début et nous pouvons récupérer l'enregistrement tronqué après l'avoir annulée. Mais ne peut pas récupérer les enregistrements tronqués de la sauvegarde du journal des transactions après la transaction tronquée validée.
Tronquer peut également être annulé ici l'exapmle
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 l'utiliser. Un choix incorrect de commande peut entraîner un processus très lent ou peut même faire exploser le segment de journal, si trop de données doivent être supprimées et que le segment de journal n'est pas suffisant. C'est pourquoi il est essentiel de savoir quand utiliser la commande tronquer et supprimer dans SQL, mais avant de les utiliser, vous devez être conscient des différences entre tronquer et supprimer, et en fonction de celles-ci, nous devrions être en mesure de savoir quand SUPPRIMER est la meilleure option pour supprimer Les données ou TRUNCATE doivent être utilisées pour purger les tables.
Référez-vous cliquez ici
Une autre différence spécifique au serveur Microsoft SQL est que delete
vous pouvez utiliser une output
instruction pour suivre les enregistrements supprimés, par exemple:
delete from [SomeTable]
output deleted.Id, deleted.Name
Vous ne pouvez pas faire cela avec truncate
.