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 una TRUNCATE 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'istruzione TRUNCATE non provoca l'esecuzione dei trigger ON DELETE.

Commenti

Sto caricando i commenti......
Content reproduced on this site is the property of its respective owners, and this content is not reviewed in advance by MariaDB. The views, information and opinions expressed by this content do not necessarily represent those of MariaDB or any other party.