Différence entre DROP et TRUNCATE


8

Qu'est-ce que le TRUNCATEfaire différemment de laisser tomber?

Je crois qu'il supprime toutes les données de la table mais conserve le nom de la table dans la base de données, où as DROPsupprime toutes les données et la table. Est-ce correct ?


Liés (et probablement beaucoup de concepts seront similaires ou identiques, même si tous les détails ne le sont pas): dba.stackexchange.com/questions/30325/delete-vs-truncate
Aaron Bertrand

Réponses:


22

SUPPRIMER - LANGUE DE MANIPULATION DES DONNÉES (DML)

L' DELETEinstruction de tout SGBDR est considérée comme une instruction DML . Également connu sous le nom de CRUD (créer, lire, mettre à jour, supprimer), ce type d'instruction est destiné à manipuler des données dans une base de données sans affecter la structure sous-jacente des objets. En termes pratiques, cela signifie:

  • Une DELETEinstruction peut être affinée à l'aide d'un prédicat via WHEREou JOINpour supprimer certaines ou toutes les lignes d'une table.
  • Une DELETEinstruction sera enregistrée par la base de données et peut être annulée dans une transaction si l'instruction échoue.
  • Généralement, un DELETEprend des verrous au niveau des lignes sur les données supprimées, bien que cela puisse augmenter si nécessaire.
  • En raison des frais généraux transactionnels, DELETEpeut être "lent" (c'est relatif), mais plus sûr car il est à grain fin.

TRUNCATE - LANGUE DE DÉFINITION DES DONNÉES (DDL)

TRUCNATEest considéré comme une instruction DDL , ce qui signifie qu'il est destiné à modifier la façon dont les objets sont définis dans une base de données. Habituellement, les instructions DDL sont CREATE, ALTERou DROP, mais ont TRUNCATEun objectif particulier, celui de "réinitialiser" une table en supprimant toutes les lignes. Les méthodes de cela diffèrent entre les moteurs RDBMS et je recommanderais de regarder les spécificités de MySQL . Les implications pratiques de a TRUNCATEsont:

  • TRUNCATEne peut pas être à grain fin. En cas de succès, il supprimera toutes les lignes de votre table.
  • TRUNCATEn'est généralement pas enregistré. Cela varie selon le SGBDR et je vous suggère de regarder plus spécifiquement comment MySQL le gère. (Indice, cela varie selon la version.)
  • TRUNCATEnécessite un verrou de métadonnées de table pour s'exécuter. La façon dont cela est réellement implémenté peut être spécifique au SGBDR, mais essentiellement le TRUNCATEprocessus doit empêcher d'autres processus de nettoyer la table afin d'exécuter son DDL.
  • Parce qu'il n'est (généralement) pas connecté et n'utilise pas de prédicats, a TRUNCATEsera plus rapide que a DELETE, mais moins sûr.

TABLEAU DROP - LANGUE DE DÉFINITION DES DONNÉES (DDL)

DROP TABLEva plus loin que TRUNCATEdans la mesure où il supprime complètement la table de la base de données. Cela inclut la suppression de tous les objets associés, tels que les index et les contraintes. Si vous supprimez une table, vous supprimez non seulement toutes les données, mais également la structure. Cela se fera généralement lorsqu'une table n'est plus nécessaire. La principale préoccupation est que, comme un DROPest DDL, vous ne pouvez généralement pas l'annuler . Certains moteurs SGBDR vous permettront d'encapsuler DDL dans une transaction afin que vous puissiez la restaurer, mais cela n'est pas considéré comme la meilleure pratique et doit être évité.


1
J'ajouterais que TRUNCATE réinitialise le compteur d'incrémentation automatique de la table.
DanMan

5

Bien que je ne puisse pas parler pour MySQL, voici un tableau rapide comparant certains aspects de la troncature et de la suppression dans Oracle.

truncate                             |   delete
---------------------------------    |   ---------------------------
DDL   (implicitly commits,           |   DML
    including any pending DML)       |  
Does not generate undo info          |   Generates undo info
    (rollback statements)            |       (rollback statements)
Resets high water mark in table      |   Does not affect full-scan 
    and all indexes, improving       |       performance
    full-scan performance            |      
Does not fire any delete triggers    |   Fires delete triggers
Priv to truncate cannot be granted   |   --
    to truncate another user's       |  
    table; DROP ANY TABLE system     |   
    priv required                    |      
Storage for table and indexes can    |   Never shrinks the size of a 
    be set to initial size           |       table or indexes
Cannot truncate parent table from    |   --
    an established referential       |  
    integrity constraint; must       |  
    first disable foreign key        |  
    that references the parent       |  
    table                            |  

Informations compilées à partir de ce livre: http://amzn.com/0470395125

Espérons que cela puisse aider les utilisateurs Oracle qui tombent sur cette page, comme je l'ai fait. N'hésitez pas à indiquer lesquels, le cas échéant, de ces points sont valables dans MySQL,


2

DROP TABLE TableName -> supprimer la table de la base de données.

TRUNCATE TABLE TableName-> supprimer les données de la table, sans condition ... et réinitialiser la IDENTITYvaleur de départ, si la table a un IDENTITYchamp.


1
  • DELETE: Commande DML, si vous exécutez la commande delete, supprimez les seules données sans déshabiller la structure de la table, nous pouvons ROLLBACK les données ligne par ligne

  • TRUNCATE: Commande DDL, si vous exécutez la commande Tronquer, supprimez les seules DONNÉES sans déshabiller la table Structure nous ne pouvons pas restaurer les données tronquer supprimer les données de manière PAGE PAR PAGE tronquer est plus rapide que supprimer la requête

  • DROP:, Commande DDL, si vous exécutez la commande DROP, supprimez (supprimez) les données et la structure totale de la table, nous ne pouvons pas non plus restaurer les données

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.