2010-04-08 16 views
16

Estoy intentando limpiar una tabla pero no deshacerme de la estructura real de la tabla. Tengo una columna id que se autoincrementa; No es necesario que guarde el número de ID, pero lo necesito para mantener su característica de incremento automático. He encontrado eliminar y truncar, pero me preocupa que uno de estos elimine por completo la tabla, lo que deja inservibles los futuros comandos de inserción.Borrar, Truncar o Soltar para limpiar una tabla en MySQL

¿Cómo elimino todos los registros de la tabla para poder insertar nuevos datos?

Respuesta

14

TRUNCATE se restablecerá su semilla de incremento automático (en las tablas InnoDB, por lo menos), si bien se puede observar su valor antes de truncar y restablecer en consecuencia después usando alter table:

ALTER TABLE t2 AUTO_INCREMENT = value 
+0

¡Buen punto para notar la semilla de autoincremento! Me olvidé de mencionar que –

+0

veo gracias hombre! –

18

drop table eliminará toda la tabla con los datos

delete * from table eliminará los datos, dejando solo los valores de autoincremento. también lleva un tiempo si hay muchos datos en la tabla.

truncate table eliminará los datos, restablecerá los valores de autoincremento (pero déjalos como columnas de autoincremento, por lo que comenzará en 1 y volverá a partir de allí), y es muy rápido.

+0

Para InnoDB 'TRUNCATE' no es tan rápido, porque hace DROP + CREATE internamente. Truncar 200 tablas pequeñas lleva varios segundos en mi sistema de desarrollo ... – Marki555

+1

borrar datos es una operación totalmente registrada. Truncar datos está mínimamente registrado –

1

Otra posibilidad consiste en la creación de una copia vacía de la tabla, el establecimiento de AUTO_INCREMENT (con un margen de maniobra posible para las inserciones durante la operación no atómico) y luego girar ambos:

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; 

Y entonces, usted tiene la ventaja adicional de poder cambiar de opinión antes de quitar la mesa anterior.

Si reconsidere su decisión, aún puede traer de vuelta los registros antiguos de la mesa antes de la operación:

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

Cuando eres bueno se puede soltar la vieja tabla:

DROP TABLE t2_old; 
4

      Caída hará exactamente eso ... soltar la tabla en cuestión, a menos que la tabla sea padre de otra tabla.

      Eliminar eliminará todos los datos que cumplan la condición; si no se especifica ninguna condición, eliminará todos los datos en la tabla.
      Truncar es similar a eliminar; sin embargo, restablece el contador auto_increment a 1 (o el valor de inicio inicial). Sin embargo, es mejor utilizar truncar sobre eliminar porque eliminar elimina los datos por cada fila, teniendo así un impacto en el rendimiento que truncar.Sin embargo, truncar no funcionará en tablas InnoDB donde se aplica la integridad referencial a menos que se apague antes de que se emita el comando truncado.
      Así que, relájate; a menos que emita un comando drop en la tabla, no se eliminará.

Cuestiones relacionadas