2010-04-08 14 views
16

Sto tentando di eliminare una tabella ma non eliminare la struttura effettiva della tabella. Ho una colonna id che si auto incrementa; Non ho bisogno di mantenere il numero ID, ma ho bisogno che mantenga le sue caratteristiche di auto-incremento. Ho trovato eliminare e troncare, ma sono preoccupato che uno di questi lascerà cadere completamente l'intera tabella rendendo inutili i futuri comandi di inserimento.Eliminare, troncare o rilasciare per pulire una tabella in MySQL

Come rimuovere tutti i record dalla tabella in modo da poter inserire nuovi dati?

risposta

14

TRUNCATE reimpostare il seme auto-incremento (su tabelle InnoDB, almeno), anche se si può notare il suo valore prima di troncare e ripristinare di conseguenza in seguito utilizzando alter table:

ALTER TABLE t2 AUTO_INCREMENT = value 
+0

Buon punto nel notare il seed dell'auto-incremento! Ho dimenticato di dire che –

+0

vedo grazie amico! –

18

drop table rimuoverà l'intera tabella con i dati

delete * from table rimuoverà i dati, lasciando da soli i valori di autoincremento. ci vuole anche un po 'se ci sono molti dati nella tabella.

truncate table rimuoverà i dati, reimposterà i valori di incremento automatico (ma li lascerà come colonne di incremento automatico, quindi inizierà solo da 1 e salirà di nuovo da lì) ed è molto veloce.

+0

Per InnoDB 'TRUNCATE' non è veloce, perché DROP + CREATE internamente. Troncare 200 tabelle piccole richiede diversi secondi sul mio sistema di sviluppo ... – Marki555

+1

L'eliminazione dei dati è un'operazione completamente registrata. Troncare i dati è registrato al minimo –

1

Un'altra possibilità consiste nel creare una copia vuota della tabella, impostando l'AUTO_INCREMENT (con qualche eventuale margine per inserimenti durante il funzionamento non-atomico) e quindi in rotazione sia:

CREATE TABLE t2_new LIKE t2; 

SELECT @newautoinc:=auto_increment /*+[leeway]*/ 
    FROM information_schema.tables 
WHERE table_name='t2'; 

SET @query = CONCAT("ALTER TABLE t2_new AUTO_INCREMENT = ", @newautoinc); 
PREPARE stmt FROM @query; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

RENAME TABLE t2 TO t2_old, t2_new TO t2; 

E poi, si ha la un ulteriore vantaggio di essere ancora in grado di cambiare idea prima di rimuovere il vecchio tavolo.

Se riconsiderare la vostra decisione, è ancora possibile riportare vecchi record dal tavolo prima che l'operazione:

INSERT /*IGNORE*/ INTO t2 SELECT * FROM t2_old /*WHERE [condition]*/; 

Quando sei bravo è possibile eliminare la vecchia tabella:

DROP TABLE t2_old; 
4

      Il calo farà proprio quello .... rilasciare la tabella in questione, a meno che la tabella non sia un genitore di un'altra tabella.

      Elimina rimuoverà tutti i dati che soddisfano la condizione; se nessuna condizione è specificata, rimuoverà tutti i dati nella tabella.
      Truncate è simile a elimina; tuttavia, ripristina il contatore auto_increment su 1 (o il valore iniziale iniziale). Tuttavia, è meglio usare truncate over delete perché elimina rimuove i dati da ciascuna riga, con un risultato di prestazioni superiore a troncato.Tuttavia, truncate non funziona sulle tabelle InnoDB in cui l'integrità referenziale viene applicata a meno che non venga disattivata prima che venga emesso il comando troncato.
      Quindi, rilassati; a meno che non si invii un comando alla rovescia sul tavolo, non verrà eliminato.

Problemi correlati