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.,
Per ottenere prestazioni elevate, TRUNCATE TABLE
ignora il metodo DML di eliminazione dei dati. Pertanto, non causa l’attivazione dei trigger ON DELETE
, non può essere eseguita per le tabelle InnoDB
con relazioni di chiavi esterne padre-figlio e non può essere ripristinata come un’operazione DML. Tuttavia,TRUNCATE TABLE
le operazioni sulle tabelle che utilizzano un motore di archiviazione supportato da DDL atomico vengono eseguite completamente o ripristinate se il server si arresta durante il funzionamento. Per ulteriori informazioni, vedere Paragrafo 13.1.,1, “Supporto dichiarazione definizione dati atomici”.
Sebbene TRUNCATE TABLE
sia simile a DELETE
, è classificato come istruzione DDL anziché come istruzione DML. Si differenzia daDELETE
nei seguenti modi:
-
Le operazioni di troncamento rilasciano e ricreano la tabella, che è molto più veloce dell’eliminazione di righe una per una, in particolare per le tabelle di grandi dimensioni.
-
Le operazioni troncate causano un commit implicito e quindi non possono essere ripristinate. Vedere Paragrafo 13.3.,3, “Dichiarazioni che causano un commit implicito””
-
Le operazioni di troncamento non possono essere eseguite se la sessione contiene un blocco tabella attivo.
-
TRUNCATE TABLE
fallisce per una tabellaInnoDB
oNDB
se ci sono vincoliFOREIGN KEY
da altre tabelle che fanno riferimento alla tabella. Sono consentiti vincoli di chiave esterna tra colonne della stessa tabella. -
Le operazioni di troncamento non restituiscono un valore significativo per il numero di righe eliminate., Il solito risultato è “0 righe interessate”, che dovrebbe essere interpretato come ” nessuna informazione.”
-
Finché la definizione della tabella è valida, la tabella può essere ricreata come una tabella vuota con
TRUNCATE TABLE
, anche se i dati o i file di indice sono danneggiati. -
Qualsiasi
AUTO_INCREMENT
valore viene ripristinato al suo valore iniziale. Questo è vero anche perMyISAM
eInnoDB
, che normalmente non riutilizzano i valori di sequenza., -
Quando viene utilizzato con tabelle partizionate,
TRUNCATE TABLE
conserva il partizionamento; cioè, i file di dati e indice vengono eliminati e ricreati, mentre le definizioni delle partizioni non vengono influenzate. -
L’istruzione
TRUNCATE TABLE
non richiama i triggerON DELETE
. -
È supportato il troncamento di una tabella
InnoDB
corrotta.
TRUNCATE TABLE
per una tabella chiude tutti i gestori per la tabella che sono stati aperti conHANDLER OPEN
.,
TRUNCATE TABLE
viene trattato ai fini della registrazione binaria e della replica come DROP TABLE
seguito da CREATE TABLE
—cioè come DDL anziché DML. Questo è dovuto al fatto che, quando si utilizza InnoDB
e transazionale motori di archiviazione in cui il livello di isolamento della transazione non permettere un’istruzione di base di registrazione (READ COMMITTED
o READ UNCOMMITTED
), l’istruzione non è stato registrato e replicato quando si utilizza STATEMENT
o MIXED
modalità di registrazione., (Bug # 36763) Tuttavia, è ancora applicato sulle repliche usando InnoDB
nel modo descritto in precedenza.
In MySQL 5.7 e versioni precedenti, su un sistema con un pool di buffer di grandi dimensioni einnodb_adaptive_hash_index
abilitato, un’operazioneTRUNCATE TABLE
potrebbe causare un calo temporaneo delle prestazioni del sistema a causa di una scansione LRU avvenuta durante la rimozione delle voci dell’indice hash adattivo della tabella (Bug #68184). La rimappatura diTRUNCATE TABLE
aDROP TABLE
eCREATE TABLE
in MySQL 8.0 evita la problematica scansione LRU.,
TRUNCATE TABLE
può essere utilizzato con tabelle di riepilogo dello schema delle prestazioni, ma l’effetto è quello di ripristinare le colonne di riepilogo a 0 o NULL
, non per rimuovere le righe. Vedere la sezione 27.12.18, “Tabelle di riepilogo dello schema delle prestazioni”.
Troncando una tabellaInnoDB
che risiede in un tablespace file-per-table viene eliminato lo tablespace esistente e ne viene creato uno nuovo. A partire da MySQL 8.0.,21, se il tablespace è stato creato con una versione precedente e risiede in una directory sconosciuta, InnoDB
crea il nuovo tablespace nella posizione predefinita e scrive il seguente avviso nel registro degli errori: il percorso della DIRECTORY dei DATI deve essere in una directory nota. La posizione della DIRECTORY dei DATI verrà ignorata e il file verrà inserito nella posizione predefinita di datadir. Le directory note sono quelle definite dalle variabilidatadir
,innodb_data_home_dir
einnodb_directories
., Per avereTRUNCATE TABLE
creare il tablespace nella sua posizione corrente, aggiungere la directory all’impostazioneinnodb_directories
prima di eseguireTRUNCATE TABLE
.