Unterschied zwischen DROP und TRUNCATE

8

Was macht das TRUNCATEanders, um fallen zu lassen?

Ich glaube, es löscht alle Daten in der Tabelle, behält aber den Tabellennamen in der Datenbank, wobei as DROPalle Daten und die Tabelle löscht. Ist das richtig ?

user1829823
quelle
Verwandte (und wahrscheinlich werden viele der Konzepte ähnlich oder identisch sein, auch wenn nicht alle Details zutreffen
Aaron Bertrand

Antworten:

22

LÖSCHEN - DATENMANIPULATIONSSPRACHE (DML)

Die DELETEAnweisung in einem RDBMS wird als DML- Anweisung betrachtet. Diese Art von Anweisung wird auch als CRUD (Create, Read, Update, Delete) bezeichnet und dient dazu, Daten in einer Datenbank zu bearbeiten, ohne die zugrunde liegende Struktur der Objekte zu beeinflussen. In der Praxis bedeutet dies:

  • Eine DELETEAnweisung kann mithilfe eines Prädikats über WHEREoder JOINzum Löschen einiger oder aller Zeilen in einer Tabelle verfeinert werden.
  • Eine DELETEAnweisung wird von der Datenbank protokolliert und kann innerhalb einer Transaktion zurückgesetzt werden, wenn die Anweisung fehlschlägt.
  • In der Regel DELETEwerden Sperren für die gelöschten Daten auf Zeilenebene vorgenommen, dies kann jedoch bei Bedarf höher eskalieren.
  • Aufgrund des Transaktionsaufwands DELETEkann es "langsam" sein (dies ist relativ), aber sicherer, weil es feinkörnig ist.

TRUNCATE - DATENDEFINITIONSSPRACHE (DDL)

TRUCNATEwird als DDL- Anweisung betrachtet, was bedeutet, dass die Definition von Objekten in einer Datenbank geändert werden soll. Normalerweise DDL - Anweisungen sind CREATE, ALTERoder DROPaber TRUNCATEdient einem bestimmten Zweck, der von „Rücksetzen von “ einer Tabelle alle Zeilen zu entfernen. Die Methoden hierfür unterscheiden sich zwischen den RDBMS-Engines, und ich würde empfehlen, die Besonderheiten von MySQL zu betrachten . Die praktischen Auswirkungen von a TRUNCATEsind:

  • TRUNCATEkann nicht feinkörnig sein. Bei Erfolg werden alle Zeilen aus Ihrer Tabelle entfernt.
  • TRUNCATEwird normalerweise nicht protokolliert. Dies variiert je nach RDBMS, und ich würde vorschlagen, dass Sie sich genauer ansehen, wie MySQL damit umgeht. (Hinweis, es variiert je nach Version.)
  • TRUNCATEFür die Ausführung ist eine Tabellenmetadatensperre erforderlich. Wie dies tatsächlich implementiert wird, kann für RDBMS spezifisch sein, aber im Wesentlichen TRUNCATEmuss der Prozess verhindern, dass andere Prozesse mit der Tabelle verwechseln, um ihre DDL auszuführen.
  • Da es (normalerweise) nicht protokolliert wird und keine Prädikate verwendet, ist a TRUNCATEschneller als a DELETE, aber weniger sicher.

DROP TABLE - DATENDEFINITIONSSPRACHE (DDL)

DROP TABLEgeht weiter als a, TRUNCATEindem es die Tabelle tatsächlich vollständig aus der Datenbank entfernt. Dies umfasst das Entfernen aller zugeordneten Objekte wie Indizes und Einschränkungen. Wenn Sie eine Tabelle löschen, entfernen Sie nicht nur alle Daten, sondern auch die Struktur. Dies erfolgt normalerweise, wenn eine Tabelle nicht mehr benötigt wird. Das Hauptanliegen ist, dass a DROPDDL normalerweise nicht rückgängig machen kann . Bei einigen RDBMS-Engines können Sie DDL in eine Transaktion einbinden, damit Sie sie zurücksetzen können. Dies wird jedoch nicht als bewährte Methode angesehen und sollte vermieden werden.

Mike Fal
quelle
1
Ich würde hinzufügen, dass TRUNCATE den Auto-Inkrement-Zähler der Tabelle zurücksetzt.
DanMan
5

Obwohl ich nicht für MySQL sprechen kann, finden Sie hier eine kurze Tabelle, in der einige Aspekte von Abschneiden und Löschen in Oracle verglichen werden.

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                            |  

Aus diesem Buch zusammengestellte Informationen: http://amzn.com/0470395125

Hoffentlich kann dies allen Oracle-Benutzern helfen, die wie ich über diese Seite stolpern. Bitte zögern Sie nicht, darauf hinzuweisen, welche dieser Punkte in MySQL zutreffen.

MollyOQ
quelle
2

DROP TABLE TableName -> Tabelle aus der Datenbank löschen.

TRUNCATE TABLE TableName-> Löschen Sie die Daten der Tabelle unbedingt ... und setzen Sie den IDENTITYStartwert zurück, wenn die Tabelle ein IDENTITYFeld enthält.

Reha Ozenc
quelle
1
  • DELETE: DML-Befehl, wenn Sie den Löschbefehl ausführen, entfernen Sie die einzigen DATEN, ohne die Tabellenstruktur zu entkleiden. Wir können die Daten zeilenweise ROLLBACKEN

  • TRUNCATE: DDL-Befehl, wenn Sie den Befehl "Abschneiden" ausführen, entfernen Sie die einzigen DATEN, ohne die Tabelle zu entkleiden

  • DROP:, DDL-Befehl, wenn Sie den DROP-Befehl zum Löschen (Entfernen) der Daten und der gesamten Tabellenstruktur ausführen, können wir die Daten auch nicht zurücksetzen

Sanjeev Reddy
quelle