2012-09-29 15 views

risposta

264

non eliminare, l'uso troncare:

Truncate table XXX 

handler la tabella non ricorda l'ultimo valore AUTO_INCREMENT utilizzato, ma inizia a contare fin dall'inizio. Questo è vero anche per MyISAM e InnoDB, che normalmente non riutilizzano i valori di sequenza.

Source.

+19

Truncate funziona bene con tabelle non vincolate, ma se la tabella ha un vincolo di chiave esterna, è possibile prendere in considerazione l'utilizzo del metodo Delete. Vedere questo post se si dispone di vincoli FK: [troncare la tabella vincolata chiave esterna] (http://stackoverflow.com/questions/5452760/truncate-foreign-key-constrained-table) –

+1

ricordare che la tabella troncata non sta per rollback –

67

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

ALTER TABLE mytable AUTO_INCREMENT = 1 
+1

Questo non ha funzionato per me. Quale potrebbe essere la ragione? –

+3

@NBhargav Perché potresti usare il motore InnoDB sul tuo tavolo invece di MyISAM, il primo non supporta il reset dell'indice. –

+0

come eliminare tutte le righe prima di modificare il valore auto_increment –

6

Un fatto interessante.

ero sicuro TRUNCATE sarà 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 TRUNCATE tutte le tabelle, al contrario di solo poche centinaia di millisecondi a DELETE le righe. L'impostazione dell'aumento automatico aggiunge circa un secondo in totale, ma è ancora molto meglio.

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

13

Se tabella ha le chiavi esterne, allora io uso sempre 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à a tempo di esecuzione. Guarda sopra la risposta di Sorin.

+1

Questo è un buon modo per avere dati orfani in qualsiasi tabella che contengono chiavi esterne al tavolo che stai cancellando. Abilitare i controlli delle chiavi esterne dopo che il fatto non ha causato a MySQL di riconvalidare quelle chiavi esterne per quanto ne so. Questo ti lascia con le righe che contengono dati che * non esiste * nella tabella di riferimento. Potresti anche non avere * chiavi estranee sul tuo tavolo. – cimmanon

Problemi correlati