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.,
aby osiągnąć wysoką wydajność,TRUNCATE TABLE
omija metodę usuwania danych DML. Tak więc ,nie powodujeON DELETE
wyzwalania do odpalenia, nie może być wykonywana dlaInnoDB
tabel z relacjami klucz obcy rodzic-dziecko i nie może być cofnięta jak operacja DML. JednakTRUNCATE TABLE
operacje na tabelach, które używają atomowego mechanizmu pamięci masowej obsługiwanego przez DDL, są albo w pełni zaangażowane, albo wycofywane, jeśli serwer zatrzyma się podczas ich działania. Więcej informacji, patrz punkt 13.1.,1, „Atomic Data Definition Statement Support”.
chociażTRUNCATE TABLE
jest podobny doDELETE
, jest klasyfikowany jako deklaracja DDL, a nie deklaracja DML. Różni się od DELETE
w następujący sposób:
-
operacje obcinania upuść i ponownie utwórz tabelę, co jest znacznie szybsze niż usuwanie wierszy jeden po drugim, szczególnie w przypadku dużych tabel.
-
operacje obcinania powodują niejawny commit, więc nie można go cofnąć. Patrz Punkt 13. 3.,3, „oświadczenia, które powodują Ukryte Commit”.
-
operacje obcinania nie mogą być wykonywane, jeśli sesja posiada aktywną blokadę tabeli.
-
TRUNCATE TABLE
nie powiodło się dlaInnoDB
tabeli lubNDB
tabeli, jeśli istnieją jakiekolwiek ograniczeniaFOREIGN KEY
z innych tabel odwołujących się do tabeli. Dozwolone są ograniczenia klucza obcego między kolumnami tej samej tabeli. -
operacje obcinania nie zwracają znaczącej wartości dla liczby usuniętych wierszy., Zwykle wynikiem jest „0 wierszy, których dotyczy problem”, co należy interpretować jako ” brak informacji.”
-
tak długo, jak definicja tabeli jest poprawna, tabela może być ponownie utworzona jako pusta z
TRUNCATE TABLE
, nawet jeśli dane lub pliki indeksów zostały uszkodzone. -
każda
AUTO_INCREMENT
wartość jest resetowana do wartości początkowej. Jest to prawdą nawet dlaMyISAM
IInnoDB
, które normalnie nie używają ponownie wartości sekwencji., -
w przypadku użycia z partycjonowanymi tabelami,
TRUNCATE TABLE
zachowuje partycjonowanie; to znaczy, Pliki Danych i indeksów są upuszczane i ponownie tworzone, podczas gdy definicje partycji nie mają wpływu. -
TRUNCATE TABLE
instrukcja nie wywołujeON DELETE
wyzwalaczy. -
Obcinanie uszkodzonej tabeli
InnoDB
jest obsługiwane.
TRUNCATE TABLE
dla tabeli zamyka wszystkie procedury obsługi tabeli, które zostały otwarte za pomocąHANDLER OPEN
.,
TRUNCATE TABLE
jest traktowany do celów logowania binarnego i replikacji jakoDROP TABLE
, a następnieCREATE TABLE
—czyli jako DDL, a nie DML. Wynika to z faktu, że podczas korzystania z InnoDB
I innych mechanizmów pamięci transakcyjnej, w których poziom izolacji transakcji nie pozwala na rejestrowanie na podstawie instrukcji (READ COMMITTED
lub READ UNCOMMITTED
), instrukcja nie była rejestrowana i replikowana podczas korzystania z STATEMENT
lub MIXED
tryb logowania., (Błąd #36763) jednak nadal jest on stosowany na replikach przy użyciu InnoDB
w opisany wcześniej sposób.
w MySQL 5.7 i starszych, w systemie z dużą pulą buforów iinnodb_adaptive_hash_index
włączona, operacjaTRUNCATE TABLE
może spowodować tymczasowy spadek wydajności systemu z powodu skanowania LRU, które wystąpiło podczas usuwania wpisów adaptive hash index w tabeli (błąd #68184). Zmiana mapowania TRUNCATE TABLE
na DROP TABLE
I CREATE TABLE
w MySQL 8.0 pozwala uniknąć problematycznego skanowania LRU.,
TRUNCATE TABLE
może być używany z tabelami podsumowania schematu wydajności, ale efektem jest Resetowanie kolumn podsumowania do 0 lubNULL
, a nie usuwanie wierszy. Zob. Sekcja 27.12.18, „Tabele Podsumowujące Schematy Wydajności”.
Obcinanie tabeliInnoDB
, która znajduje się w tabeli file-per-table, powoduje usunięcie istniejącej tabeli i utworzenie nowej. Od MySQL 8.0.,21, jeśli przestrzeń tablespace została utworzona z wcześniejszą wersją I znajduje się w nieznanym katalogu, InnoDB
tworzy nową przestrzeń tablespace w domyślnej lokalizacji i zapisuje następujące ostrzeżenie do dziennika błędów: lokalizacja katalogu DATA musi znajdować się w znanym katalogu. Lokalizacja katalogu danych zostanie zignorowana, a plik zostanie umieszczony w domyślnej lokalizacji datadir. Znane katalogi to te zdefiniowane przezdatadir
,innodb_data_home_dir
orazinnodb_directories
zmienne., AbyTRUNCATE TABLE
utworzyć przestrzeń tabel w bieżącej lokalizacji, Dodaj katalog do Ustawieniainnodb_directories
przed uruchomieniemTRUNCATE TABLE
.