Truncate vs Delete en MySQL/MariaDB (Diferencias)

Si lo que deseas es eliminar datos de una tabla, en MySQL tienes 2 formas de hacerlo, normalmente usamos el delete from table para ese tipo de acciones, es un DML ( lenguaje de manipulación de datos) por tanto admite parámetros usando condiciones, es decir soporta la clausula WHERE además que te devuelve el numero de archivos afectados en la operación y puedes incluso usar el LIMIT. recuerden que el DELETE borra registros 1 por 1 además que la tabla recuerda el valor AUTO_INCREMENT en caso la hayas vaciado.

En el caso del TRUNCATE lo que se realiza es destruir la tabla y luego recrearla ya que es un DLL (lenguaje de definición de datos), lo que lo hace más rápido y no devuelve registros afectados, TRUNCATE TABLE es una extensión de Oracle SQL adoptada en MySQL. y optimizado para MySQL 5.0.3, antes de la versión 5.0.3 ambos comandos son prácticamente lo mismo.

Usando DELETE es posible de hacer:

delete from TABLA where userid<10 limit 2

y si quieres eliminar todos los registros de la tabla simplemente no le pones la clausula WHERE, recuerda que este tipo de eliminación lo hace registro por registro

delete from TABLE

Usando TRUNCATE:

TRUNCATE table

TRUNCATE TABLE muy rápido. La operación se mapea a DELETE si hay restricciones de clave foránea que referencien la tabla. Para otros motores, TRUNCATE TABLE difiere de DELETE FROM en los siguientes puntos en MySQL 5.0.3:

  • Las operaciones de truncado destruyen y recrean la tabla, que es mucho más rápido que borrar registros uno a uno.
  • Las operaciones de truncado no son transaccionales; ocurre un error al intentar un truncado durante una transacción o un bloqueo de tabla.
  • No se retorna el número de registros borrados.
  • Mientras el fichero de definición de la tabla tbl_name.frm sea válido, la tabla puede recrearse como una vacía con TRUNCATE TABLE, incluso si los ficheros de datos o de índice se han corrompido.
  • El tratador de tablas no recuerda el último valor AUTO_INCREMENT usado, pero empieza a contar desde el principio. Esto es cierto incluso para MyISAM y InnoDB, que normalmente no reúsan valores de secuencia.

Resumen de Diferencias:

  1. Ambas eliminan los datos, no la estructura de la tabla.
  2. DELETE permite la eliminación condicional de los registros.
  3. DELETE es una operación registrada en el log de transacciones, y registrar cada eliminación de manera individual.
  4. TRUNCATE es una operación registrada en el log de transacciones, pero en conjunto, no por eliminación individual. TRUNCATE se registra como una liberación de las páginas de datos en las cuales existen los datos.
  5. TRUNCATE es más rápida que DELETE.
  6. Ambas se pueden deshacer con un ROLLBACK.
  7. TRUNCATE reiniciará el contador para una tabla que contenga una columna AUTO_INCREMENT .
  8. DELETE mantendrá el contador de la tabla para una columna IDENTITY.
  9. TRUNCATE no desencadena un TRIGGER, DELETE sí.
  10. TRUNCATE es un comando DDL(lenguaje de definición de datos como un CREATE, ALTER, DROP, etc.) mientras que DELETE es un DML(lenguaje de manipulación de datos como un SELECT, INSERT, UPDATE).

Comments

2 respuestas a “Truncate vs Delete en MySQL/MariaDB (Diferencias)”

  1. santiago bernal Avatar

    Estimado, excelente explicación sobre el tema, me aclaró muchas dudas.
    muchas gracias.

    pda: te recomiendo utilizar facebook commets en vez de usar los de wordpress.

  2. David Avatar
    David

    En el punto nº 6 del resúmen de diferencias, se indica: “Ambas se pueden deshacer con un ROLLBACK.”, pero he comprobado que en MySQL 8.0.17 no permite hacer ROLLBACK al TRUNCATE table.

Agregue un comentario a santiago bernal Cancelar respuesta

Su dirección de correo no se hará público. Los campos requeridos están marcados *