TRUNCATE TABLE
Sintassi
TRUNCATE [TABLE] nome_tabella
Spiegazione
TRUNCATE TABLE
svuota completamente una tabella. A partire da MySQL 5.1.16 richiede il privilegio DROP
. Prima, richiedeva il privilegio DELETE
. Si veda GRANT
.
Da un punto di vista logico, TRUNCATE TABLE
equivale a un'istruzione DELETE
che cancella tutte le righe, ma in alcune circostanze vi sono delle differenze pratiche.
Su una tabella InnoDB, lo Storage Engine esegue TRUNCATE TABLE
cancellando le righe una per una se vi sono di vincoli associate alle chiavi esterne. Se non ci sono chiavi esterne, InnoDB esegue un troncamento rapido eliminando la tabella originale e ricreandone una vuota con la stessa definizione, il che è molto più veloce che cancellare le righe una ad una. Il contatore AUTO_INCREMENT
viene azzerato da TRUNCATE TABLE
, indipendentemente dal fatto che possano esserci o meno dei vincoli di chiavi esterne.
Nel caso in cui vi siano dei vincoli di chiavi esterne, InnoDB cancella le righe una ad una e per ognuna elabora i vincoli. Se il vincolo è di tipo DELETE CASCADE
, le righe della tabella figlia vengono eliminate, e la tabella troncata viene svuotata. Se i vincoli non sono CASCADE
, l'istruzione TRUNCATE
cancella le righe (una ad una) ma si ferma se incontra una riga padre a cui è associata una figlia, restituendo l'errore:
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`child`, CONSTRAINT `child_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`))
Questo comportamento è identico a quello dell'istruzione DELETE
senza clausola WHERE
.
Il conteggio delle righe eliminate da TRUNCATE TABLE
è accurato solo nel caso in cui viene mappata a un'istruzione DELETE
.
Negli altri Storage Engine, in MariaDB 5.1, TRUNCATE TABLE
si comporta diversamente da DELETE
nei seguenti casi:
- Le operazioni truncate eliminano e ricreano la tabella, e questo è molto più veloce che cancellare le righe una per una, in particolare per le tabelle di grandi dimensioni.
- Le operazioni truncate causano una commit implicita.
- Le operazioni truncate non possono essere eseguite se una sessione ha un lock attivo sulla tabella.
- Le operazioni truncate non restituiscono un valore significativo per il numero di righe eliminate. Solitamente il risultato è "0 rows affected", che dovrebbe essere interpretato come "nessuna informazione".
- A patto che il formato del file
tbl_name.frm
sia valido, la tabella può essere ricreata come file vuoto con unaTRUNCATE TABLE
, anche se i dati o il file degli indici sono corrotti. - Il gestore della tabella non ricorda l'ultimo valore
AUTO_INCREMENT
usato, ma ricomincia a contare dall'inizio. Questo è vero anche per MyISAM e InnoDB, che normalmente non riutilizzano i vecchi valori. - Se utilizzato con tabelle partizionate,
TRUNCATE TABLE
preserva le partizioni; questo significa che i file dei dati e degli indici vengono eliminati e ricreati, mentre le definizioni delle partizioni (.par) non vengono toccati. - Siccome il troncamento di una tabella non usa
DELETE
, l'istruzioneTRUNCATE
non provoca l'esecuzione dei triggerON DELETE
.