¿Cuál es la diferencia entre TRUNCAR y ELIMINAR en SQL?

Resuelto David Aldridge asked hace 16 años • 33 respuestas

¿Cuál es la diferencia entre TRUNCATEyDELETE en SQL?

Si su respuesta es específica de la plataforma, indíquelo.

David Aldridge avatar Sep 26 '08 20:09 David Aldridge
Aceptado

Aquí hay una lista de diferencias. He resaltado las características específicas de Oracle y espero que la comunidad también pueda agregar las diferencias específicas de otros proveedores. Las diferencias que son comunes a la mayoría de los proveedores pueden ir directamente debajo de los títulos, y las diferencias se resaltan a continuación.


Visión general

Si desea eliminar rápidamente todas las filas de una tabla, y está realmente seguro de querer hacerlo y no tiene claves externas en las tablas, entonces TRUNCATE probablemente será más rápido que DELETE. .

Es necesario considerar varias cuestiones específicas del sistema, como se detalla a continuación.


Tipo de declaración

Eliminar es DML, Truncar es DDL (¿ Qué es DDL y DML? )


Confirmar y revertir

Variable por proveedor

Servidor SQL

Truncar se puede revertir.

PostgreSQL

Truncar se puede revertir.

Oráculo

Debido a que TRUNCATE es DDL, implica dos confirmaciones, una antes y otra después de la ejecución de la declaración. Por lo tanto, el truncado no se puede revertir y, de todos modos, un error en el proceso de truncado habrá emitido una confirmación.

Sin embargo, vea Flashback a continuación.


Recuperación de espacio

Eliminar no recupera espacio, Truncar recupera espacio

Oráculo

Si utiliza la cláusula REUSE STORAGE, los segmentos de datos no se desasignan, lo que puede ser marginalmente más eficiente si la tabla se va a recargar con datos. La marca de límite superior se restablece.


Alcance de la fila

Eliminar se puede utilizar para eliminar todas las filas o solo un subconjunto de filas. Truncar elimina todas las filas.

Oráculo

Cuando se particiona una tabla, las particiones individuales se pueden truncar de forma aislada, por lo que es posible una eliminación parcial de todos los datos de la tabla.


Tipos de objetos

La eliminación se puede aplicar a tablas y tablas dentro de un clúster. Truncar se aplica solo a tablas o a todo el clúster. (Puede ser específico de Oracle)


Identidad del objeto de datos

Oráculo

Eliminar no afecta la identificación del objeto de datos, pero truncar asigna una nueva identificación del objeto de datos a menos que nunca haya habido una inserción en la tabla desde su creación. Incluso una sola inserción que se revierte hará que se asigne una nueva identificación del objeto de datos al truncarse. .


Flashback (Oráculo)

El flashback funciona en todas las eliminaciones, pero un truncamiento evita el retroceso a estados anteriores a la operación.

Sin embargo, a partir de 11gR2 la función FLASHBACK ARCHIVE lo permite, excepto en Express Edition.

Uso de FLASHBACK en Oracle http://docs.oracle.com/cd/E11882_01/appdev.112/e41502/adfns_flashback.htm#ADFNS638


Privilegios

Variable

Oráculo

La eliminación se puede conceder en una tabla a otro usuario o rol, pero no se puede truncar sin utilizar una concesión DROP ANY TABLE.


Rehacer Deshacer

Eliminar genera una pequeña cantidad de rehacer y una gran cantidad de deshacer. Truncate genera una cantidad insignificante de cada uno.


Índices

Oráculo

Una operación de truncado hace que los índices inutilizables se puedan volver a utilizar. Eliminar no lo hace.


Llaves extranjeras

No se puede aplicar un truncamiento cuando una clave externa habilitada hace referencia a la tabla. El tratamiento con eliminación depende de la configuración de las claves externas.


Bloqueo de mesa

Oráculo

Truncar requiere un bloqueo de tabla exclusivo, eliminar requiere un bloqueo de tabla compartido. Por lo tanto, deshabilitar los bloqueos de tablas es una forma de evitar truncar operaciones en una tabla.


Desencadenantes

Los desencadenadores DML no se activan al truncarse.

Oráculo

Los activadores DDL están disponibles.


Ejecución remota

Oráculo

No se puede truncar a través de un enlace de base de datos.


Columnas de identidad

Servidor SQL

Truncar restablece la secuencia para los tipos de columnas IDENTIDAD, eliminar no.


Conjunto resultante

En la mayoría de las implementaciones, una DELETEdeclaración puede devolver al cliente las filas que se eliminaron.

por ejemplo, en un subprograma Oracle PL/SQL podría:

DELETE FROM employees_temp
WHERE       employee_id = 299 
RETURNING   first_name,
            last_name
INTO        emp_first_name,
            emp_last_name;
David Aldridge avatar Sep 26 '2008 13:09 David Aldridge

La diferencia entre truncar y eliminar se enumera a continuación:

+----------------------------------------+----------------------------------------------+
|                Truncate                |                    Delete                    |
+----------------------------------------+----------------------------------------------+
| We can't Rollback after performing     | We can Rollback after delete.                |
| Truncate.                              |                                              |
|                                        |                                              |
| Example:                               | Example:                                     |
| BEGIN TRAN                             | BEGIN TRAN                                   |
| TRUNCATE TABLE tranTest                | DELETE FROM tranTest                         |
| SELECT * FROM tranTest                 | SELECT * FROM tranTest                       |
| ROLLBACK                               | ROLLBACK                                     |
| SELECT * FROM tranTest                 | SELECT * FROM tranTest                       |
+----------------------------------------+----------------------------------------------+
| Truncate reset identity of table.      | Delete does not reset identity of table.     |
+----------------------------------------+----------------------------------------------+
| It locks the entire table.             | It locks the table row.                      |
+----------------------------------------+----------------------------------------------+
| Its DDL(Data Definition Language)      | Its DML(Data Manipulation Language)          |
| command.                               | command.                                     |
+----------------------------------------+----------------------------------------------+
| We can't use WHERE clause with it.     | We can use WHERE to filter data to delete.   |
+----------------------------------------+----------------------------------------------+
| Trigger is not fired while truncate.   | Trigger is fired.                            |
+----------------------------------------+----------------------------------------------+
| Syntax :                               | Syntax :                                     |
| 1) TRUNCATE TABLE table_name           | 1) DELETE FROM table_name                    |
|                                        | 2) DELETE FROM table_name WHERE              |
|                                        |    example_column_id IN (1,2,3)              |
+----------------------------------------+----------------------------------------------+
Bhaumik Patel avatar Oct 15 '2012 17:10 Bhaumik Patel

GOTA

El comando DROP elimina una tabla de la base de datos. También se eliminarán todas las filas, índices y privilegios de las tablas. No se activarán activadores DML. La operación no se puede revertir.

TRUNCAR

TRUNCATE elimina todas las filas de una tabla. La operación no se puede revertir y no se activará ningún disparador. Como tal, TRUNCATE es más rápido y no utiliza tanto espacio para deshacer como DELETE. El bloqueo a nivel de tabla se agregará al truncar.

BORRAR

El comando ELIMINAR se utiliza para eliminar filas de una tabla. Se puede utilizar una cláusula WHERE para eliminar solo algunas filas. Si no se especifica ninguna condición WHERE, se eliminarán todas las filas. Después de realizar una operación DELETE, debe COMMITIR o ROLLBACK la transacción para que el cambio sea permanente o deshacerlo. Tenga en cuenta que esta operación hará que se activen todos los activadores DELETE de la tabla. El bloqueo de nivel de fila se agregará al eliminar.

De: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands

Mohit Singh avatar Apr 15 '2015 08:04 Mohit Singh

Todas buenas respuestas, a las que debo agregar:

Dado que TRUNCATE TABLEes un comando DDL ( lenguaje de definición de datos ), no un comando DML ( lenguaje de manipulación de datos ), Delete Triggersno se ejecuta.

polara avatar Sep 26 '2008 14:09 polara