Diferencia entre DROP y TRUNCATE


8

¿Qué hace el TRUNCATEdiferente para soltar?

Creo que elimina todos los datos de la tabla, pero mantiene el nombre de la tabla en la base de datos, donde DROPelimina todos los datos y la tabla. Es esto correcto ?


Relacionado (y probablemente muchos de los conceptos serán similares o idénticos, incluso si no todos los detalles están): dba.stackexchange.com/questions/30325/delete-vs-truncate
Aaron Bertrand

Respuestas:


22

BORRAR - LENGUAJE DE MANIPULACIÓN DE DATOS (DML)

La DELETEdeclaración en cualquier RDBMS se considera una declaración DML . También conocido como CRUD (Crear, Leer, Actualizar, Eliminar), este tipo de declaración está destinada a manipular datos en una base de datos sin afectar la estructura subyacente de los objetos. Lo que esto significa en términos prácticos es:

  • Una DELETEdeclaración se puede ajustar utilizando un predicado a través de WHEREo JOINpara eliminar algunas o todas las filas de una tabla.
  • La DELETEbase de datos registrará una declaración y puede revertirla dentro de una transacción si la declaración falla.
  • Por lo general DELETE, a tomará bloqueos de nivel de fila en los datos que se eliminan, aunque esto podría aumentar aún más según sea necesario.
  • Debido a la sobrecarga transaccional, DELETEpuede ser "lento" (esto es relativo), pero más seguro porque es de grano fino.

TRUNCATE - LENGUAJE DE DEFINICIÓN DE DATOS (DDL)

TRUCNATEse considera una declaración DDL , lo que significa que tiene la intención de alterar cómo se definen los objetos en una base de datos. Por lo general, las declaraciones DDL son CREATE, ALTERo DROP, pero tienen TRUNCATEun propósito particular, el de "restablecer" una tabla eliminando todas las filas. Los métodos de este difieren entre los motores RDBMS y recomendaría mirar los detalles de MySQL . Las implicaciones prácticas de a TRUNCATEson:

  • TRUNCATENo puede ser de grano fino. Si tiene éxito, eliminará todas las filas de su tabla.
  • TRUNCATEnormalmente no se registra. Esto varía según RDBMS y sugeriría que mire más específicamente cómo MySQL lo maneja. (Sugerencia, varía según la versión).
  • TRUNCATErequiere un bloqueo de metadatos de tabla para ejecutarse. La forma en que esto se implementa realmente puede ser específica para RDBMS, pero esencialmente el TRUNCATEproceso debe evitar que otros procesos interfieran con la tabla para ejecutar su DDL.
  • Debido a que (normalmente) no está registrado y no utiliza predicados, a TRUNCATEserá más rápido que a DELETE, pero menos seguro.

TABLA DE GOTA - LENGUAJE DE DEFINICIÓN DE DATOS (DDL)

DROP TABLEva más allá de a TRUNCATEen que en realidad elimina la tabla de la base de datos por completo. Esto incluye eliminar todos los objetos asociados, como índices y restricciones. Si dejara caer una tabla, no solo eliminaría todos los datos, sino también la estructura. Esto generalmente se hará cuando ya no se necesite una tabla. La principal preocupación es que, dado que a DROPes DDL, normalmente no se puede deshacer . Algunos motores RDBMS le permitirán ajustar DDL dentro de una transacción para que pueda revertirlo, pero esto no se considera la mejor práctica y debe evitarse.


1
Agregaría que TRUNCATE restablece el contador de incremento automático de la tabla.
DanMan

5

Aunque no puedo hablar por MySQL, aquí hay una tabla rápida que compara algunos aspectos de truncar frente a eliminar dentro de Oracle.

truncate                             |   delete
---------------------------------    |   ---------------------------
DDL   (implicitly commits,           |   DML
    including any pending DML)       |  
Does not generate undo info          |   Generates undo info
    (rollback statements)            |       (rollback statements)
Resets high water mark in table      |   Does not affect full-scan 
    and all indexes, improving       |       performance
    full-scan performance            |      
Does not fire any delete triggers    |   Fires delete triggers
Priv to truncate cannot be granted   |   --
    to truncate another user's       |  
    table; DROP ANY TABLE system     |   
    priv required                    |      
Storage for table and indexes can    |   Never shrinks the size of a 
    be set to initial size           |       table or indexes
Cannot truncate parent table from    |   --
    an established referential       |  
    integrity constraint; must       |  
    first disable foreign key        |  
    that references the parent       |  
    table                            |  

Información compilada de este libro: http://amzn.com/0470395125

Espero que esto pueda ayudar a cualquier usuario de Oracle que se encuentre con esta página, como lo hice yo. Por favor, siéntase libre de señalar cuál de estos puntos, si alguno, es cierto en MySQL,


2

DROP TABLE TableName -> eliminar la tabla de la base de datos.

TRUNCATE TABLE TableName-> eliminar los datos de la tabla, incondicionalmente ... y restablecer el IDENTITYvalor inicial, si la tabla tiene un IDENTITYcampo.


1
  • DELETE: Comando DML, si ejecuta el comando eliminar, elimine los únicos DATOS sin quitar la estructura de la tabla, podemos ROLLBACK los datos fila por fila

  • TRUNCATE: Comando DDL, si ejecuta el comando Truncar, elimine los únicos DATOS sin desarmar la estructura de la tabla, no podemos deshacer los datos truncar, eliminar los datos de una página a otra, truncar es más rápido y luego eliminar la consulta

  • DROP:, Comando DDL, si ejecuta el comando DROP, eliminará (eliminará) los datos y la estructura de la tabla total, tampoco podremos deshacer los datos

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.