MySQL Eliminar todas las filas de la tabla y restablecer la ID a cero
183
Necesito eliminar todas las filas de una tabla, pero cuando agrego una nueva fila, quiero que la ID de la clave principal, que tiene un incremento automático, comience nuevamente desde 0 respectivamente desde 1.
El controlador de la tabla no recuerda el último valor AUTO_INCREMENT utilizado, pero comienza a contar desde el principio. Esto es cierto incluso para MyISAM e InnoDB, que normalmente no reutilizan valores de secuencia.
Truncar funciona bien con tablas no restringidas, pero si su tabla tiene una restricción de clave externa, puede considerar usar el método Delete. Vea esta publicación si tiene restricciones FK: truncar la tabla restringida de clave externa
Julian Soro
1
recuerde que la tabla truncada no va a revertirse
penny chan
83
Si no puede usar TRUNCATE(por ejemplo, debido a restricciones de clave externa), puede usar una tabla alter después de eliminar todas las filas para reiniciar el auto_increment:
@NBhargav Debido a que puede estar usando el motor InnoDB en su mesa en lugar de MyISAM, el primero no admite el reinicio del índice.
Gustavo Rubio
cómo eliminar todas las filas antes de modificar el valor de auto_increment
Kasun Siyambalapitiya
@KasunSiyambalapitiya DELETE FROM tablename;(pero eso no va a funcionar bien cuando hay restricciones FK - ver stackoverflow.com/a/5452798/507761 )
Matthew Read
17
Si la tabla tiene claves foráneas, siempre uso el siguiente código:
SET FOREIGN_KEY_CHECKS =0;-- disable a foreign keys checkSET AUTOCOMMIT =0;-- disable autocommitSTARTTRANSACTION;-- 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 checkCOMMIT;-- make a commitSET AUTOCOMMIT =1;
Pero la diferencia estará en el tiempo de ejecución. Mira arriba la respuesta de Sorin.
Esta es una buena manera de tener datos huérfanos en cualquier tabla que formen claves ajenas a la tabla que está borrando. Habilitar las comprobaciones de claves externas después del hecho no hace que MySQL revalide esas claves externas hasta donde yo sé. Esto lo deja con filas que contienen datos que no existen en la tabla de referencia. Es posible que ni siquiera tenga claves foráneas en su mesa.
cimmanon
8
Un hecho interesante
Estaba seguro de TRUNCATEque siempre funcionaría mejor, pero en mi caso, para una base de datos con aproximadamente 30 tablas con claves foráneas, poblada con solo unas pocas filas, tomó aproximadamente 12 segundos para TRUNCATEtodas las tablas, en lugar de solo unos pocos cientos de milisegundos para DELETEel filas Establecer el incremento automático agrega aproximadamente un segundo en total, pero aún es mucho mejor.
Así que sugeriría probar ambos, ver cuál funciona más rápido para su caso.
Si no puede usar
TRUNCATE
(por ejemplo, debido a restricciones de clave externa), puede usar una tabla alter después de eliminar todas las filas para reiniciar el auto_increment:fuente
DELETE FROM tablename;
(pero eso no va a funcionar bien cuando hay restricciones FK - ver stackoverflow.com/a/5452798/507761 )Si la tabla tiene claves foráneas, siempre uso el siguiente código:
Pero la diferencia estará en el tiempo de ejecución. Mira arriba la respuesta de Sorin.
fuente
Un hecho interesante
Estaba seguro de
TRUNCATE
que siempre funcionaría mejor, pero en mi caso, para una base de datos con aproximadamente 30 tablas con claves foráneas, poblada con solo unas pocas filas, tomó aproximadamente 12 segundos paraTRUNCATE
todas las tablas, en lugar de solo unos pocos cientos de milisegundos paraDELETE
el filas Establecer el incremento automático agrega aproximadamente un segundo en total, pero aún es mucho mejor.Así que sugeriría probar ambos, ver cuál funciona más rápido para su caso.
fuente
si quieres usar
truncate
usa esto:fuente