¿Cuál es la diferencia entre TRUNCAR y ELIMINAR en SQL?
¿Cuál es la diferencia entre TRUNCATE
yDELETE
en SQL?
Si su respuesta es específica de la plataforma, indíquelo.
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 DELETE
declaració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;
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) |
+----------------------------------------+----------------------------------------------+
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
Todas buenas respuestas, a las que debo agregar:
Dado que TRUNCATE TABLE
es un comando DDL ( lenguaje de definición de datos ), no un comando DML ( lenguaje de manipulación de datos ), Delete Triggers
no se ejecuta.