13.1.37 TRUNCATE TABLE Statement
TRUNCATE tbl_name
TRUNCATE TABLE
empties a table completely. It requires the DROP
privilege. Logically, TRUNCATE TABLE
is similar to a DELETE
statement that deletes all rows, or a sequence of DROP TABLE
and CREATE TABLE
statements.,
Um eine hohe Leistung zu erzielen, umgeht TRUNCATE TABLE
die DML-Methode zum Löschen von Daten. Daher werden keine ON DELETE
-Trigger ausgelöst, es kann nicht für InnoDB
– Tabellen mit Eltern-Kind-Fremdschlüsselbeziehungen ausgeführt werden und es kann nicht wie eine DML-Operation zurückgesetzt werden. TRUNCATE TABLE
Operationen an Tabellen, die eine atomare DDL-unterstützte Speicher-Engine verwenden, werden jedoch entweder vollständig festgeschrieben oder zurückgesetzt, wenn der Server während ihres Betriebs angehalten wird. Weitere Informationen finden Sie unter Abschnitt 13.1.,1, „Atomic Daten Definition Anweisung Unterstützung“.
Obwohl TRUNCATE TABLE
DELETE
ähnlich ist, wird es eher als DDL-Anweisung als als DML-Anweisung klassifiziert. Es unterscheidet sich von DELETE
auf folgende Weise:
-
Truncate Operationen löschen und neu erstellen Sie die Tabelle, die viel schneller ist als das Löschen von Zeilen nacheinander, insbesondere für große Tabellen.
-
Truncate-Operationen verursachen ein implizites Commit und können daher nicht zurückgesetzt werden. Siehe Abschnitt 13.3.,3, „Anweisungen, die ein implizites Commit verursachen“.
-
Kürzungsoperationen können nicht ausgeführt werden, wenn die Sitzung eine aktive Tabellensperre enthält.
-
TRUNCATE TABLE
schlägt für eineInnoDB
– Tabelle oderNDB
– Tabelle fehl, wennFOREIGN KEY
– Einschränkungen aus anderen Tabellen vorliegen, die auf die Tabelle verweisen. Fremdschlüsseleinschränkungen zwischen Spalten derselben Tabelle sind zulässig. -
Kürzungsoperationen geben keinen aussagekräftigen Wert für die Anzahl gelöschter Zeilen zurück., Das übliche Ergebnis ist „0 betroffene Zeilen“, was als „keine Informationen“ interpretiert werden sollte.“
-
Solange die Tabellendefinition gültig ist, kann die Tabelle als leere Tabelle mit
TRUNCATE TABLE
neu erstellt werden, auch wenn die Daten oder Indexdateien beschädigt wurden. -
Jeder
AUTO_INCREMENT
Wert wird auf seinen Startwert zurückgesetzt. Dies gilt auch fürMyISAM
undInnoDB
, die normalerweise keine Sequenzwerte wiederverwenden., -
Bei Verwendung mit partitionierten Tabellen behält
TRUNCATE TABLE
die Partitionierung bei; Das heißt, die Daten – und Indexdateien werden gelöscht und neu erstellt, während die Partitionsdefinitionen nicht betroffen sind. -
Die
TRUNCATE TABLE
– Anweisung ruft keineON DELETE
– Trigger auf. -
das Abschneiden einer beschädigten
InnoDB
Tabelle unterstützt wird.
TRUNCATE TABLE
für eine Tabelle schließt alle Handler für die Tabelle, die mit HANDLER OPEN
geöffnet wurden.,
TRUNCATE TABLE
wird zum Zwecke der binären Protokollierung und Replikation als DROP TABLE
behandelt, gefolgt von CREATE TABLE
—also als DDL und nicht als DML. Dies ist auf die Tatsache zurückzuführen, dass bei Verwendung von InnoDB
und anderen Transaktionsspeichermaschinen, bei denen die Transaktionsisolationsstufe keine anweisungsbasierte Protokollierung zulässt (READ COMMITTED
oder READ UNCOMMITTED
), die Anweisung nicht protokolliert und repliziert wurde, wenn STATEMENT
oder MIXED
Protokollierungsmodus., (Fehler #36763) Es wird jedoch weiterhin auf Replikate mit InnoDB
in der zuvor beschriebenen Weise angewendet.
In MySQL 5.7 und früher kann auf einem System mit aktiviertem großen Pufferpool und innodb_adaptive_hash_index
eine TRUNCATE TABLE
– Operation zu einem vorübergehenden Rückgang der Systemleistung aufgrund eines LRU-Scans führen, der beim Entfernen der adaptiven Hash-Indexeinträge der Tabelle aufgetreten ist (Fehler #68184). Die Neuzuordnung von TRUNCATE TABLE
zu DROP TABLE
und CREATE TABLE
in MySQL 8.0 vermeidet den problematischen LRU-Scan.,
TRUNCATE TABLE
kann mit Leistungsschema-Zusammenfassungstabellen verwendet werden, der Effekt besteht jedoch darin, die Zusammenfassungsspalten auf 0 oder NULL
zurückzusetzen und keine Zeilen zu entfernen. Siehe Abschnitt 27.12.18 ,“ Leistungsschema-Zusammenfassungstabellen“.
Das Abschneiden einerInnoDB
-Tabelle, die sich in einem Datei-pro-Tabelle-Tablespace befindet, löscht den vorhandenen Tablespace und erstellt einen neuen. Ab MySQL 8.0.,wenn der Tablespace mit einer früheren Version erstellt wurde und sich in einem unbekannten Verzeichnis befindet, erstellt InnoDB
den neuen Tablespace am Standardspeicherort und schreibt die folgende Warnung in das Fehlerprotokoll: Der Speicherort des DATENVERZEICHNISSES muss sich in einem bekannten Verzeichnis befinden. Der Speicherort des DATENVERZEICHNISSES wird ignoriert und die Datei wird in den Standardspeicherort datadir abgelegt. Bekannte Verzeichnisse sind diejenigen, die durch die Variablen datadir
, innodb_data_home_dir
und innodb_directories
definiert sind., Um TRUNCATE TABLE
den Tablespace an seinem aktuellen Speicherort erstellen zu lassen, fügen Sie das Verzeichnis der Einstellung hinzu, bevor Sie TRUNCATE TABLE
.