Quelle est la différence entre TRUNCATE et DELETE en SQL

303

Quelle est la différence entre TRUNCATEet DELETEen SQL?

Si votre réponse est spécifique à la plate-forme, veuillez l'indiquer.

David Aldridge
la source
4
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.


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 DELETEinstruction 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;
David Aldridge
la source
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)              |
+----------------------------------------+----------------------------------------------+
Bhaumik Patel
la source
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.

De: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands

Mohit Singh
la source
5
Belle explication pour un débutant comme moi
Vikas Kukreti
Court et doux
ABH
23

Toutes les bonnes réponses, auxquelles je dois ajouter:

Étant donné qu'il TRUNCATE TABLEs'agit d'un DDL ( Data Defination Language ), et non d'une commande DML ( Data Manipulation Langauge ), le Delete Triggersne s'exécute pas.

polara
la source
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.
Meff
PostgreSQL a un "déclencheur TRUNCATE"
a_horse_with_no_name
17

Avec SQL Server ou MySQL, s'il existe un PK avec incrémentation automatique, tronquer réinitialise le compteur.

mathieu
la source
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.

Walter Mitty
la source
7

TRUNCATEest l'instruction DDL alors qu'elle DELETEest une instruction DML. Voici les différences entre les deux:

  1. 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.

  2. 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.

  3. 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.

  4. TRUNCATEles instructions ne déclenchent pas les déclencheurs par opposition au déclencheur de suppression de l' DELETEinstruction

Voici le très bon lien pertinent au sujet.

Sachin Chourasiya
la source
6

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.

DCookie
la source
PostgreSQL est également similaire à cela.
Gavin M. Roy, le
6

TRONQUER

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.
Purvi Barot
la source
5

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.

wpzone4u
la source
1
Merci @Lucas: il a inséré le contenu. Je viens de le mettre dans une citation pour montrer qu'il provenait d'une source différente.
AstroCB
4

Dans SQL Server 2005, je pense que vous pouvez annuler une troncature


la source
4

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

MyUserQuestion
la source
Est-ce que cela ajoute quelque chose aux réponses actuelles?
David Aldridge
3

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é.

SQLnbe
la source
2

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
CaptainPicard
la source
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.
Saurabh Sinha
2

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.

Mangal Pardeshi
la source
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 bigint SET @ai =IDENT_CURRENT('tablename') TRUNCATE TABLE tablename DBCC 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.

Plus de détails ici

Apprentissage
la source
1

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.

Bhushan Patil
la source
1

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/

user27332
la source
1

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.

côté ouest
la source
0

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

Oskar
la source
0

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.

Jordan Ogren
la source
0

Impossible de faire DDL sur un dblink.


la source
0

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.

nathan
la source
0

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.

user2587360
la source
0

Tronquer peut également être annulé ici l'exapmle

begin Tran
delete from  Employee

select * from Employee
Rollback
select * from Employee
Vinay Pandit
la source
0

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

wpzone4u
la source
0

En émettant une instruction TRUNCATE TABLE, vous demandez à SQL Server de supprimer chaque enregistrement d'une table, sans aucun enregistrement ou traitement de transaction.

Gerald
la source
0

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.

Ali
la source
0

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:

delete from [SomeTable]
output deleted.Id, deleted.Name

Vous ne pouvez pas faire cela avec truncate.

Mykhailo Seniutovych
la source