2012-09-29 17 views

Respuesta

264

no borre, el uso truncado:

Truncate table XXX 

manejador de la tabla no recuerda el último valor AUTO_INCREMENT usado, pero empieza a contar desde el principio. Esto es cierto incluso para MyISAM e InnoDB, que normalmente no reutilizan valores de secuencia.

Source.

+19

Truncar funciona bien con tablas no restringidas, pero si su tabla tiene una restricción de clave externa, puede considerar usar el método Eliminar. Consulte esta publicación si tiene restricciones de FK: [tabla restringida de clave externa truncada] (http://stackoverflow.com/questions/5452760/truncate-foreign-key-constrained-table) –

+1

recuerde que la tabla truncada no se va a retrotraer –

67

Si no puede utilizar TRUNCATE (por ejemplo, debido a las restricciones de clave externa) se puede utilizar una modificación de tabla después de eliminar todas las filas para reiniciar el AUTO_INCREMENT:

ALTER TABLE mytable AUTO_INCREMENT = 1 
+1

Esto no funcionó para mí. ¿Cuál podría ser la razón? –

+3

@NBhargav Debido a que es posible que esté utilizando el motor InnoDB en su mesa en lugar de MyISAM, el primero no es compatible con restablecer el índice. –

+0

cómo eliminar todas las filas antes de alterar el valor auto_increment –

6

Un hecho interesante.

Estaba seguro TRUNCATE siempre se obtienen mejores resultados, pero en mi caso, para una base de datos con aproximadamente 30 tablas con claves externas, pobladas con sólo unas pocas filas, que tomó cerca de 12 segundos para TRUNCATE todas las tablas, en comparación con solamente unos pocos cientos de milisegundos a DELETE las filas. Configurar el incremento automático agrega alrededor de un segundo en total, pero todavía es mucho mejor.

Así que sugeriría probar ambos, ver cuál funciona más rápido para su caso.

13

Si la tabla tiene las claves externas a continuación, siempre uso siguiente código:

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 ; 

Pero la diferencia estará en tiempo de ejecución. Mire por encima de la respuesta de Sorin.

+1

Esta es una buena forma de tener datos huérfanos en cualquier tabla que eliminen las claves externas de la tabla. Habilitar las comprobaciones de claves foráneas después del hecho no hace que MySQL revalide esas claves foráneas, hasta donde yo sé. Esto le deja con filas que contienen datos que * no existe * en la tabla de referencia. Es muy posible que ni siquiera * tengas * llaves extranjeras en tu mesa. – cimmanon

Cuestiones relacionadas