Toutes les réponses sont spécifiques à la plateforme. Il n'y a pas de commande TRUNCATE dans SQL standard. Il s'agit donc d'une fonctionnalité exclusive et signifie une chose différente pour chaque fournisseur de SGBD.
nvogel
La réponse est très spécifique à l'implémentation, car elle doit l'être, car comme sqlvogel l'a souligné, il s'agit d'une commande non standard (TRUNCATE). Soit nous quittons cet 'oracle' marqué, soit nous en faisons une réponse de style wiki communautaire, et nous mettons les conséquences pour chaque RDBMS majeur (Oracle, MS-MSQL, PostgreSQL implémentent tous TRUNCATE ...)
reedstrm
Si la transaction est effectuée, signifie COMMITED, alors nous ne pouvons pas annuler la commande TRUNCATE, mais nous pouvons toujours annuler la commande DELETE à partir des fichiers LOG, car DELETE write les enregistre dans le fichier Log au cas où il serait nécessaire de revenir à l'avenir à partir des fichiers LOG.
Réponses:
272
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.
Aperçu général
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.
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.
Remise en état de l'espace
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.
Portée de la ligne
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.
Types d'objets
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)
Identité d'objet de données
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 (Oracle)
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
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.
Rétablir / Annuler
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.
Index
Oracle
Une opération tronquée rend les index inutilisables réutilisables. Supprimer ne fonctionne 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 table
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.
Déclencheurs
Les déclencheurs DML ne se déclenchent pas sur un 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é
Serveur SQL
Tronquer réinitialise la séquence des types de colonnes IDENTITY, mais pas la suppression.
Ensemble de résultats
Dans la plupart des implémentations, une DELETEinstruction peut renvoyer au client les lignes qui ont été supprimées.
Par exemple, dans un sous-programme Oracle PL / SQL, vous pourriez:
DELETEFROM employees_temp
WHERE employee_id =299
RETURNING first_name,
last_name
INTO emp_first_name,
emp_last_name;
Je ne comprends pas votre quatrième affirmation: si je dis DELETE [ ] FROM Table; alors * toutes les lignes de ce tableau seront supprimées sauf si un FK l'arrête. Soit dit en passant, je suppose que cela est spécifique à SQL Server, vous ne pouvez pas utiliser TRUNCATE sur des tables avec des FK.
Joe Pineda
Quelques commentaires supplémentaires: je ne suis pas d'accord avec votre troisième déclaration, sauf si elle est spécifique à Oracle. Au moins avec SQL S., si vous SUPPRIMEZ ou TRONQUEZ, vous ne récupérez pas d'espace (c'est-à-dire que les fichiers de base de données ne diminuent pas sur le disque dur) à moins que vous ne le demandiez spécifiquement.
Joe Pineda
1
5ème déclaration: vous pouvez annuler une TRUNCATE TABLE sur sql 2008 r2
Eric Labashosky
1
Postgresql peut annuler un TRUNCATE et donc ne pas l'engager automatiquement.
rfusca
5
DELETE renvoie le nombre de lignes supprimées, mais TRUNCATE ne le fait pas. C'est un point très stupide mais mérite d'être mentionné :)
Deepak Kumar Jha
192
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) |
+----------------------------------------+----------------------------------------------+
Tronquer réinitialiser l'identité de la table Qu'est - ce que cela signifie? Mais qu'en est-il de la suppression?
Ravi
1
@jWeaver: cela signifie que lorsque vous définissez la propriété Identity Specification sur True pour le champ Clé primaire, donc lorsque vous insérez des données dans cette table, la colonne de clé primaire contient une valeur comme 1,2,3,4,5 .... (si Identity démarre à partir de 1 et la valeur de départ est 1), et lorsque vous tronquez la table, elle perdra toute valeur d'identité, donc lorsque vous recommencerez à insérer des données dans cette table, elle commencera à partir de 1 au lieu de la dernière place. Dans DELETE, c'est l'inverse, il conserve la valeur d'identité même après avoir exécuté l'instruction DELETE. Désolé pour la 2e erreur de point de comparaison dans la colonne SUPPRIMER dans l'image ci-dessus.
Bhaumik Patel
On dirait que vous répondez pour SQL SERVER
Ravi
4
TRUNCATE et DELETE peuvent être rolledBack dans SQL SERVER . Et dans la deuxième ligne, la dose SUPPRIMER ne réinitialise pas l'identité. Maintenant, comment pouvez-vous modifier ce message? C'est la mauvaise chose à propos de l'utilisation d'images dans StackOverflow.
Mahmood Jenami
2
Tronquer est annulé! (SQL SERVER)
Aimal Khan
55
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.
Ah, les déclencheurs ... c'est un bon point. Je vais ajouter cela à la liste que j'ai faite et je vous remercie Polara, si cela vous convient.
David Aldridge
SQL Server ne vous permettra pas de tronquer une table avec des clés étrangères, votre point en cascade pourrait donc être théorique, selon la plate-forme.
Pour clarifier, c'est pour SQL Server si la table a une colonne définie comme IDENTITY. Supprimer conserverait le dernier ID attribué automatiquement, tandis que Tronquer réinitialise le compteur.
Codewerks
Comme la question est étiquetée ORACLE, cette réponse est FAUX, donc sous-votée.
Guy
oups, je n'ai pas vu le tag oracle :)
math
+1 vrai, et il le remet à 0 . Si vous voulez que ce soit 1 à la place:DBCC CHECKIDENT (table_name, RESEED, 1)
JohnB
J'ai ajouté cela dans la réponse de la communauté et je l'ai rendu un peu plus convivial pour documenter les problèmes spécifiques aux fournisseurs
David Aldridge
12
"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.
TRUNCATEest l'instruction DDL alors qu'elle DELETEest une instruction DML. Voici les différences entre les deux:
Comme TRUNCATEc'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é, DELETEune instruction DML ( Data manipulation language ) nécessite donc une validation explicite pour rendre son effet permanent.
TRUNCATEsupprime toujours toutes les lignes d'une table, laissant la table vide et la structure de la table intacte alors qu'elle DELETEpeut être supprimée conditionnellement si la clause where est utilisée.
Les lignes supprimées par l' TRUNCATE TABLEinstruction ne peuvent pas être restaurées et vous ne pouvez pas spécifier la clause where dans l' TRUNCATEinstruction.
TRUNCATEles instructions ne déclenchent pas les déclencheurs par opposition au déclencheur de suppression de l' DELETEinstruction
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.
TRUNCATE La requête SQL supprime toutes les lignes d'une table, sans enregistrer les suppressions de lignes individuelles.
TRUNCATE est une commande DDL.
TRUNCATE est exécuté à l'aide d'un verrou de table et la table entière est verrouillée pour supprimer tous les enregistrements.
Nous ne pouvons pas utiliser la clause WHERE avec TRUNCATE.
TRUNCATE supprime toutes les lignes d'une table.
Journalisation minimale dans le journal des transactions, ce qui accélère les performances.
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.
Pour utiliser Tronquer sur une table, vous devez avoir au moins l'autorisation ALTER sur la table.
Tronquer utilise moins d'espace de transaction que l'instruction Delete.
Truncate ne peut pas être utilisé avec des vues indexées.
TRUNCATE est plus rapide que DELETE.
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.
DELETE est une commande DML.
DELETE est exécuté à l'aide d'un verrou de ligne, chaque ligne du tableau est verrouillée pour suppression.
Nous pouvons utiliser la clause where avec DELETE pour filtrer et supprimer des enregistrements spécifiques.
La commande DELETE est utilisée pour supprimer des lignes d'une table en fonction de la condition WHERE.
Il conserve le journal, il est donc plus lent que TRUNCATE.
L'instruction DELETE supprime les lignes une par une et enregistre une entrée dans le journal des transactions pour chaque ligne supprimée.
Identity of column keep DELETE conserve l'identité.
Pour utiliser Supprimer, vous devez disposer de l'autorisation SUPPRIMER sur la table.
Supprimer utilise plus d'espace de transaction que l'instruction Tronquer.
La suppression peut être utilisée avec des vues indexées.
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.
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.
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>deletefrom t1;10918rows deleted.
Elapsed:00:00:00.58
Execution Plan----------------------------------------------------------0DELETE STATEMENT Optimizer=FIRST_ROWS (Cost=43 Card=1)10DELETEOF'T1'21TABLE 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)10918rows processed
son ancien fil, mais selon ma compréhension, tronquer ne génère qu'une bonne quantité de journal de rétablissement, tandis que la suppression génère des opérations d'annulation et de rétablissement à la fois.
• 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.
Salut Mangal - merci pour la réponse, en particulier pour les problèmes spécifiques à SQL * Server. Pensez-vous que vous pourriez intégrer ces points à la réponse du wiki communautaire qui a été acceptée?
David Aldridge
Oui bien sûr, mais comment et où? Désolé, je suis nouveau ici.
Mangal Pardeshi
"Donc, si vous voulez conserver le compteur d'identité, utilisez DELETE" pourriez-vous utiliserDECLARE @ai as bigintSET @ai =IDENT_CURRENT('tablename')TRUNCATE TABLE tablenameDBCC checkident('tablename', RESEED, @ai)
mpag
1
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.
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.
DELETEis a DML command
DELETE you can rollbackDelete= Only Delete- so it can be rolled back
InDELETE you can write conditions usingWHERE clause
Syntax –Deletefrom[Table]where[Condition]
TRONQUER
TRUNCATEis 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)inTRUNCATE
Syntax –Truncatetable[Table]
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.
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 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.
En émettant une instruction TRUNCATE TABLE, vous demandez à SQL Server de supprimer chaque enregistrement d'une table, sans aucun enregistrement ou traitement de transaction.
L'instruction DELETE peut avoir une clause WHERE pour supprimer des enregistrements spécifiques tandis que l'instruction TRUNCATE n'en nécessite pas et efface la table entière. Surtout, l'instruction DELETE enregistre la date supprimée, contrairement à l'instruction TRUNCATE.
Une autre différence spécifique au serveur Microsoft SQL est que deletevous pouvez utiliser une outputinstruction pour suivre les enregistrements supprimés, par exemple:
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.
Aperçu général
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.
Type de relevé
Supprimer est DML, tronquer est DDL ( Qu'est-ce que DDL et DML? )
Valider et annuler
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.
Remise en état de l'espace
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.
Portée de la ligne
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.
Types d'objets
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)
Identité d'objet de données
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 (Oracle)
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
Privilèges
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.
Rétablir / Annuler
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.
Index
Oracle
Une opération tronquée rend les index inutilisables réutilisables. Supprimer ne fonctionne 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 table
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.
Déclencheurs
Les déclencheurs DML ne se déclenchent pas sur un 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é
Serveur SQL
Tronquer réinitialise la séquence des types de colonnes IDENTITY, mais pas la suppression.
Ensemble de résultats
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:
la source
La différence entre tronquer et supprimer est répertoriée ci-dessous:
la source
De: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands
la source
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 ), leDelete Triggers
ne s'exécute pas.la source
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
la source
Avec SQL Server ou MySQL, s'il existe un PK avec incrémentation automatique, tronquer réinitialise le compteur.
la source
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.
la source
TRUNCATE
est l'instruction DDL alors qu'elleDELETE
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'elleDELETE
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
instructionVoici le très bon lien pertinent au sujet.
la source
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.
la source
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.
la source
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 :
la source
Dans SQL Server 2005, je pense que vous pouvez annuler une troncature
la source
De: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands
la source
TRUNCATE peut être annulé s'il est encapsulé dans une transaction.
Veuillez voir les deux références ci-dessous et testez-vous: -
http://blog.sqlauthority.com/2007/12/26/sql-server-truncate-cant-be-rolled-back-using-log-files-after-transaction-session-is-closed/
http://sqlblog.com/blogs/kalen_delaney/archive/2010/10/12/tsql-tuesday-11-rolling-back-truncate-table.aspx
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é.
la source
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:
la source
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.
la source
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
la source
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.
la source
SUPPRIMER
TRONQUER
Pour plus de détails, visitez
http://www.zilckh.com/what-is-the-difference-between-truncate-and-delete/
la source
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.
la source
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
la source
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.
la source
Impossible de faire DDL sur un dblink.
la source
Je commenterais le post de Matthieu, mais je n'ai pas encore de représentant ...
Dans MySQL, le compteur d'incrémentation automatique est réinitialisé avec tronquer, mais pas avec supprimer.
la source
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.
la source
Tronquer peut également être annulé ici l'exapmle
la source
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
la source
En émettant une instruction TRUNCATE TABLE, vous demandez à SQL Server de supprimer chaque enregistrement d'une table, sans aucun enregistrement ou traitement de transaction.
la source
L'instruction DELETE peut avoir une clause WHERE pour supprimer des enregistrements spécifiques tandis que l'instruction TRUNCATE n'en nécessite pas et efface la table entière. Surtout, l'instruction DELETE enregistre la date supprimée, contrairement à l'instruction TRUNCATE.
la source
Une autre différence spécifique au serveur Microsoft SQL est que
delete
vous pouvez utiliser uneoutput
instruction pour suivre les enregistrements supprimés, par exemple:Vous ne pouvez pas faire cela avec
truncate
.la source