MySQL Elimina tutte le righe dalla tabella e reimposta l'ID su zero


183

Devo eliminare tutte le righe da una tabella ma quando aggiungo una nuova riga, desidero che l'ID chiave principale, che ha un incremento automatico, ricomincia da 0 rispettivamente da 1.

Risposte:


304

Non eliminare, utilizzare troncare:

Truncate table XXX

Il gestore della tabella non ricorda l'ultimo valore AUTO_INCREMENT utilizzato, ma inizia il conteggio dall'inizio. Questo vale anche per MyISAM e InnoDB, che normalmente non riutilizzano i valori della sequenza.

Fonte .


20
Troncare funziona bene con le tabelle non vincolate, ma se la tabella ha un vincolo di chiave esterna, è possibile prendere in considerazione l'utilizzo del metodo Elimina. Vedi questo post se hai vincoli FK: tronca la tabella vincolata con chiave esterna
Julian Soro

1
ricorda che la tabella troncata non tornerà indietro
penny chan il

83

Se non è possibile utilizzare TRUNCATE(ad esempio a causa di vincoli di chiave esterna) è possibile utilizzare una tabella di modifica dopo aver eliminato tutte le righe per riavviare l'auto_increment:

ALTER TABLE mytable AUTO_INCREMENT = 1

3
@NBhargav Poiché potresti utilizzare il motore InnoDB sulla tabella anziché MyISAM, il primo non supporta il ripristino dell'indice.
Gustavo Rubio,

come eliminare tutte le righe prima di modificare il valore auto_increment
Kasun Siyambalapitiya

@KasunSiyambalapitiya DELETE FROM tablename;(ma che non funzionerà bene quando ci sono vincoli FK - vedi stackoverflow.com/a/5452798/507761 )
Matteo Leggi il

17

Se la tabella ha chiavi esterne, utilizzo sempre il seguente codice:

SET FOREIGN_KEY_CHECKS = 0; -- disable a foreign keys check
SET AUTOCOMMIT = 0; -- disable autocommit
START TRANSACTION; -- begin transaction

/*
DELETE FROM table_name;
ALTER TABLE table_name AUTO_INCREMENT = 1;
-- or
TRUNCATE table_name;
-- or
DROP TABLE table_name;
CREATE TABLE table_name ( ... );
*/

SET FOREIGN_KEY_CHECKS = 1; -- enable a foreign keys check
COMMIT;  -- make a commit
SET AUTOCOMMIT = 1 ;

Ma la differenza sarà nei tempi di esecuzione. Guarda sopra la risposta di Sorin.


2
Questo è un buon modo per avere dati orfani in qualsiasi tabella che le chiavi esterne alla tabella che stai cancellando. L'abilitazione dei controlli delle chiavi esterne dopo il fatto non fa sì che MySQL riconvalida quelle chiavi esterne per quanto ne so. Questo ti lascia con righe che contengono dati che non esistono nella tabella di riferimento. Potresti anche non avere affatto chiavi esterne sul tuo tavolo.
cimmanon,

8

Un fatto interessante

Ero sicuro che TRUNCATEsarà sempre un rendimento migliore, ma nel mio caso, per un database con circa 30 tavoli con chiavi esterne, popolati con poche righe, ci sono voluti circa 12 secondi per TRUNCATEtutti i tavoli, in contrapposizione a solo poche centinaia di millisecondi per DELETEil filari. L'impostazione dell'incremento automatico aggiunge circa un secondo in totale, ma è ancora molto meglio.

Quindi suggerirei di provare entrambi, vedi quale funziona più velocemente per il tuo caso.


2

se vuoi usare truncateusa questo:

SET FOREIGN_KEY_CHECKS = 0; 
TRUNCATE table $table_name; 
SET FOREIGN_KEY_CHECKS = 1;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.