¿Cuál es la diferencia entre TRUNCATE y DELETE en SQL?

303

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

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

David Aldridge
fuente
44
Todas las respuestas son específicas de la plataforma. No hay un comando TRUNCATE en SQL estándar. Por lo tanto, es una característica patentada y significa algo diferente para cada proveedor de DBMS.
nvogel
La respuesta es muy específica de la implementación, como debe ser, ya que, como señaló sqlvogel, este es un comando no estándar (TRUNCATE). Deje este etiquetado 'oráculo' o hagamos que sea una respuesta de estilo wiki comunitario, y ponga las consecuencias para cada RDBMS principal (Oracle, MS-MSQL, PostgreSQL implementan TRUNCATE ...)
reedstrm
Si se realiza la transacción, significa COMPROMISO, entonces no podemos revertir el comando TRUNCATE, pero aún podemos revertir el comando DELETE de los archivos LOG, ya que la escritura DELETE los registra en el archivo Log en caso de que sea necesario retroceder en el futuro a partir de los archivos LOG.

Respuestas:

272

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


Visión general

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

Se deben considerar varios problemas específicos del sistema, como se detalla a continuación.


Tipo de declaración

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


Comprometerse y revertir

Variable por vendedor

Servidor SQL

Truncar puede revertirse.

PostgreSQL

Truncar puede revertirse.

Oráculo

Debido a que un TRUNCATE es DDL, involucra dos commits, uno antes y otro después de la ejecución de la declaración. Truncar, por lo tanto, no se puede revertir, y una falla en el proceso de truncado habrá emitido una confirmación de todos modos.

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 volver a cargar con datos. La marca de nivel máximo 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 divide 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 objeto

Eliminar se puede aplicar a tablas y tablas dentro de un clúster. Truncar se aplica solo a las tablas o al clúster completo. (Puede ser específico de Oracle)


Identidad de objeto de datos

Oráculo

Eliminar no afecta la identificación del objeto de datos, pero truncar asigna una nueva identificación de 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 de objeto de datos al truncamiento .


Flashback (Oracle)

Flashback funciona a través de eliminaciones, pero un truncamiento previene flashback a estados previos 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 otorgar en una tabla a otro usuario o rol, pero el truncamiento no se puede realizar sin usar una concesión DROP ANY TABLE.


Rehacer Deshacer

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


Índices

Oráculo

Una operación truncada vuelve a utilizar los índices inutilizables. 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 eliminar 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 tabla es una forma de evitar operaciones truncadas en una tabla.


Disparadores

Los disparadores DML no se disparan en un truncado.

Oráculo

Los desencadenadores DDL están disponibles.


Ejecución Remota

Oráculo

Truncar no se puede emitir a través de un enlace de base de datos.


Columnas de identidad

Servidor SQL

Truncar restablece la secuencia para los tipos de columna IDENTIDAD, la eliminación 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 de Oracle PL / SQL usted podría:

DELETE FROM employees_temp
WHERE       employee_id = 299 
RETURNING   first_name,
            last_name
INTO        emp_first_name,
            emp_last_name;
David Aldridge
fuente
No entiendo su cuarta declaración: si digo DELETE [ ] FROM Table; luego * todas las filas de esa tabla se eliminarán a menos que un FK lo detenga. Por cierto, supongo que esto es específico de SQL Server, no puede usar TRUNCATE en tablas con FK.
Joe Pineda el
Algunos comentarios más: no estoy de acuerdo con su tercera declaración, a menos que sea específica de Oracle. Al menos con SQL S., ya sea si ELIMINA o TRUNCA, no recupera espacio (es decir, los archivos de la base de datos no se reducen en el disco duro) a menos que lo solicite específicamente.
Joe Pineda el
1
5ª Declaración: puede deshacer una TABLA DE TRUNCADO en sql 2008 r2
Eric Labashosky
1
Postgresql puede deshacer un TRUNCATE y, por lo tanto, tampoco lo confirma automáticamente.
rfusca
55
DELETE devuelve el número de filas eliminadas, pero TRUNCATE no. Es un punto muy tonto pero vale la pena mencionarlo :)
Deepak Kumar Jha
192

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
fuente
Truncar restablecer identidad de tabla ¿Qué significa? Pero, ¿qué pasa con Eliminar?
Ravi
1
@jWeaver: significa que cuando establece la propiedad de Especificación de identidad en Verdadero para el campo Clave primaria, por lo tanto, cuando inserta datos en esa tabla, la columna de clave primaria contiene un valor como 1,2,3,4,5 .... (si se inicia Identidad desde 1 y la inicialización es 1), y cuando trunca la tabla, perderá todo el valor de identidad, por lo que cuando comience a insertar datos en esa tabla nuevamente, comenzará desde 1 en lugar de donde se dejó al final. En DELETE, es inverso, conserva el valor de identidad incluso después de ejecutar la declaración DELETE. Perdón por el error del segundo punto de comparación en la columna DELETE en la imagen de arriba.
Bhaumik Patel
Parece que estás respondiendo para SQL SERVER
Ravi
44
Tanto TRUNCATE como DELETE se pueden rollBack en SQL SERVER . Y en la segunda fila ELIMINAR dosis no restablece la identidad. Ahora, ¿cómo puedes editar esta publicación? Eso es lo malo de usar imágenes en StackOverflow.
Mahmood Jenami
2
Truncar se está haciendo retroceder! (SERVIDOR SQL)
Aimal Khan
55

SOLTAR

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 dispararán disparadores 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án disparadores. Como tal, TRUNCATE es más rápido y no utiliza tanto espacio para deshacer como un DELETE. El bloqueo de nivel de tabla se agregará al truncar.

ELIMINAR

El comando DELETE se usa para eliminar filas de una tabla. Se puede usar una cláusula WHERE para eliminar solo algunas filas. Si no se especifica la condición WHERE, se eliminarán todas las filas. Después de realizar una operación ELIMINAR, debe COMENZAR o RODAR la transacción para que el cambio sea permanente o para deshacerlo. Tenga en cuenta que esta operación hará que se activen todos los desencadenantes DELETE en 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
fuente
55
Buena explicación para un principiante como yo
Vikas Kukreti
Corto y dulce
ABH
23

Todas buenas respuestas, a lo 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
fuente
Ah, disparadores ... ese es un buen punto. Agregaré eso a la lista que hice y le daré crédito a Polara, si está bien.
David Aldridge
SQL Server no le permitirá truncar una tabla con claves foráneas, por lo que su punto en cascada podría ser discutible, dependiendo de la plataforma.
Meff
PostgreSQL tiene un "TRUNCATE Trigger"
a_horse_with_no_name
17

Con SQL Server o MySQL, si hay una PK con incremento automático, truncar restablecerá el contador.

Mathieu
fuente
Para aclarar, esto es para SQL Server si la tabla tiene una columna definida como IDENTIDAD. Eliminar mantendría la última ID asignada automáticamente, mientras que Truncar restablecerá el contador.
Codewerks
Como la pregunta está etiquetada ORACLE, entonces esta respuesta es INCORRECTA, por lo tanto, rechazada.
Guy
oops, no vi la etiqueta del oráculo :)
mathieu
+1 verdadero, y lo restablece a 0 . Si quieres que sea 1 :DBCC CHECKIDENT (table_name, RESEED, 1)
JohnB
Agregué esto a la respuesta de la comunidad y lo hice un poco más amigable para documentar problemas específicos del proveedor
David Aldridge,
12

"Truncar no registra nada" es correcto. Yo iría más lejos:

Truncar no se ejecuta en el contexto de una transacción.

La ventaja de velocidad de truncar sobre eliminar debería ser obvia. Esa ventaja varía de trivial a enorme, dependiendo de su situación.

Sin embargo, he visto truncar sin querer romper la integridad referencial y violar otras restricciones. El poder que obtienes modificando los datos fuera de una transacción tiene que equilibrarse con la responsabilidad que heredas cuando caminas por la cuerda floja sin una red.

Walter Mitty
fuente
7

TRUNCATEes la declaración DDL mientras que DELETEes una declaración DML. A continuación se presentan las diferencias entre los dos:

  1. Como TRUNCATEes una declaración DDL ( lenguaje de definición de datos ), no requiere una confirmación para que los cambios sean permanentes. Y esta es la razón por la cual las filas eliminadas por truncamiento no se pudieron revertir. Por otro lado, DELETEes una declaración DML ( lenguaje de manipulación de datos ), por lo tanto, requiere una confirmación explícita para que su efecto sea permanente.

  2. TRUNCATEsiempre elimina todas las filas de una tabla, dejando la tabla vacía y la estructura de la tabla intacta, mientras que DELETEpuede eliminar condicionalmente si se usa la cláusula where.

  3. Las filas eliminadas por la TRUNCATE TABLEdeclaración no se pueden restaurar y no puede especificar la cláusula where en la TRUNCATEdeclaración.

  4. TRUNCATEdeclaraciones no dispara los disparadores en lugar de en el gatillo de borrar en DELETEla declaración

Aquí está el muy buen enlace relevante para el tema.

Sachin Chourasiya
fuente
6

Sí, DELETE es más lento, TRUNCATE es más rápido. ¿Por qué?

DELETE debe leer los registros, verificar las restricciones, actualizar el bloque, actualizar los índices y generar rehacer / deshacer. Todo eso lleva tiempo.

TRUNCATE simplemente ajusta un puntero en la base de datos para la tabla (High Water Mark) y poof! Los datos se han ido.

Esto es específico de Oracle, AFAIK.

DCookie
fuente
PostgreSQL es similar a esto también.
Gavin M. Roy
6

TRUNCAR

La consulta TRUNCATE SQL elimina todas las filas de una tabla, sin registrar las eliminaciones de filas individuales.

  • TRUNCATE es un comando DDL.
  • TRUNCATE se ejecuta utilizando un bloqueo de tabla y se bloquea toda la tabla para eliminar todos los registros.
  • No podemos usar la cláusula WHERE con TRUNCATE.
  • TRUNCATE elimina todas las filas de una tabla.
  • Registro mínimo en el registro de transacciones, por lo que es más rápido en cuanto a rendimiento.
  • TRUNCATE TABLE elimina los datos al desasignar las páginas de datos utilizadas para almacenar los datos de la tabla y registra solo las desasignaciones de páginas en el registro de transacciones.
  • Para usar Truncar en una tabla, necesita al menos el permiso ALTER en la tabla.
  • Truncar utiliza menos espacio de transacción que la instrucción Eliminar.
  • Truncar no se puede usar con vistas indexadas.
  • TRUNCATE es más rápido que DELETE.

ELIMINAR

Para ejecutar una cola DELETE, se requieren permisos de eliminación en la tabla de destino. Si necesita usar una cláusula WHERE en un DELETE, también se requieren permisos de selección.

  • DELETE es un comando DML.
  • DELETE se ejecuta usando un bloqueo de fila, cada fila de la tabla está bloqueada para su eliminación.
  • Podemos usar la cláusula where con DELETE para filtrar y eliminar registros específicos.
  • El comando DELETE se usa para eliminar filas de una tabla en función de la condición WHERE.
  • Mantiene el registro, por lo que es más lento que TRUNCATE.
  • La instrucción DELETE elimina filas de una en una y registra una entrada en el registro de transacciones para cada fila eliminada.
  • La identidad de la columna keep DELETE retiene la identidad.
  • Para usar Eliminar necesita el permiso DELETE en la tabla.
  • Eliminar utiliza más espacio de transacción que la instrucción Truncar.
  • Eliminar se puede usar con vistas indexadas.
Purvi Barot
fuente
5

Si accidentalmente eliminó todos los datos de la tabla usando Eliminar / Truncar. Puede revertir la transacción confirmada. Restaure la última copia de seguridad y ejecute el registro de transacciones hasta el momento en que Eliminar / Truncar está a punto de suceder.

La siguiente información relacionada es de una publicación de blog :

Mientras trabajamos en la base de datos, estamos usando Eliminar y Truncar sin conocer las diferencias entre ellos. En este artículo discutiremos la diferencia entre Eliminar y Truncar en SQL.

Eliminar:

  • Eliminar es un comando DML.
  • La declaración de eliminación se ejecuta utilizando un bloqueo de fila, cada fila de la tabla está bloqueada para su eliminación.
  • Podemos especificar filtros en la cláusula where.
  • Elimina los datos especificados si existe una condición.
  • Eliminar actividades un desencadenante porque la operación se registra individualmente.
  • Más lento que truncar porque mantiene registros

Truncar

  • Truncar es un comando DDL.
  • Truncar tabla siempre bloquea la tabla y la página, pero no cada fila, ya que elimina todos los datos.
  • No se puede usar Donde condición.
  • Elimina todos los datos.
  • Truncar tabla no puede activar un desencadenador porque la operación no registra eliminaciones de filas individuales.
  • Más rápido en cuanto a rendimiento, porque no guarda ningún registro.

Nota: Eliminar y Truncar pueden revertirse cuando se usan con Transaction. Si la transacción se realiza, significa comprometido, entonces no podemos revertir el comando Truncar, pero aún podemos revertir el comando Eliminar de los archivos de registro, ya que eliminar escribir los registra en el archivo de registro en caso de que sea necesario retroceder en el futuro a partir de los archivos de registro.

Si tiene una restricción de clave externa que se refiere a la tabla que está intentando truncar, esto no funcionará incluso si la tabla de referencia no contiene datos. Esto se debe a que la comprobación de la clave externa se realiza con DDL en lugar de DML. Esto se puede solucionar deshabilitando temporalmente las restricciones de clave externa en la tabla.

Eliminar tabla es una operación registrada. Por lo tanto, la eliminación de cada fila se registra en el registro de transacciones, lo que lo hace lento. Truncar tabla también elimina todas las filas de una tabla, pero no registrará la eliminación de cada fila, sino que registrará la desasignación de las páginas de datos de la tabla, lo que lo hace más rápido.

~ Si accidentalmente eliminó todos los datos de la tabla usando Eliminar / Truncar. Puede revertir la transacción confirmada. Restaure la última copia de seguridad y ejecute el registro de transacciones hasta el momento en que Eliminar / Truncar está a punto de suceder.

wpzone4u
fuente
1
Gracias @Lucas: él incluyó el contenido. Simplemente lo puse en una cita en bloque para hacer evidente que era de una fuente diferente.
AstroCB
4

En SQL Server 2005, creo que puede deshacer un truncamiento


fuente
4

ELIMINAR

El comando DELETE se usa para eliminar filas de una tabla. Se puede usar una cláusula WHERE para eliminar solo algunas filas. Si no se especifica la condición WHERE, se eliminarán todas las filas. Después de realizar una operación ELIMINAR, debe COMENZAR o RODAR la transacción para que el cambio sea permanente o para deshacerlo. Tenga en cuenta que esta operación hará que se activen todos los desencadenantes DELETE en la tabla.

TRUNCAR

TRUNCATE elimina todas las filas de una tabla. La operación no se puede revertir y no se activarán disparadores. Como tal, TRUCATE es más rápido y no usa tanto espacio para deshacer como un DELETE.

SOLTAR

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 dispararán disparadores DML. La operación no se puede revertir.


DROP y TRUNCATE son comandos DDL, mientras que DELETE es un comando DML. Por lo tanto, las operaciones DELETE pueden revertirse (deshacerse), mientras que las operaciones DROP y TRUNCATE no pueden revertirse.

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

MyUserQuestion
fuente
¿Esto agrega algo a las respuestas actuales?
David Aldridge
3

TRUNCATE puede revertirse si se envuelve en una transacción.

Consulte las dos referencias a continuación y pruébelo usted mismo:

http://blog.sqlauthority.com/2007/12/26/sql-server-truncate-cant-be-rolled-back-using-log-files-after-transaction-session-is-closed/

http://sqlblog.com/blogs/kalen_delaney/archive/2010/10/12/tsql-tuesday-11-rolling-back-truncate-table.aspx

TRUNCATE vs. DELETE es una de las preguntas infames durante las entrevistas SQL. Solo asegúrese de explicárselo correctamente al entrevistador o podría costarle el trabajo. El problema es que no muchos lo saben, lo más probable es que consideren que la respuesta es incorrecta si les dice que YES Truncate puede revertirse.

SQLnbe
fuente
2

Una pequeña corrección a la respuesta original: eliminar también genera cantidades significativas de rehacer (ya que deshacer está protegido por rehacer). Esto se puede ver en la salida de autotrace:

SQL> delete from t1;

10918 rows deleted.

Elapsed: 00:00:00.58

Execution Plan
----------------------------------------------------------
   0      DELETE STATEMENT Optimizer=FIRST_ROWS (Cost=43 Card=1)
   1    0   DELETE OF 'T1'
   2    1     TABLE ACCESS (FULL) OF 'T1' (TABLE) (Cost=43 Card=1)




Statistics
----------------------------------------------------------
         30  recursive calls
      12118  db block gets
        213  consistent gets
        142  physical reads
    3975328  redo size
        441  bytes sent via SQL*Net to client
        537  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          2  sorts (memory)
          0  sorts (disk)
      10918  rows processed
Capitán Picard
fuente
su hilo anterior pero, según tengo entendido, truncar solo genera una buena cantidad de registro de rehacer donde, como eliminar, genera deshacer y rehacer ambos.
Saurabh Sinha
2

Aquí está mi respuesta detallada sobre la diferencia entre DELETE y TRUNCATE en SQL Server

Eliminar datos : lo primero es lo primero, ambos se pueden utilizar para eliminar las filas de la tabla.
Pero un DELETE puede usarse para eliminar las filas no solo de una Tabla, sino también de una VIEW o el resultado de un OPENROWSET u OPENQUERY sujeto a las capacidades del proveedor.

Cláusula FROM : con DELETE también puede eliminar filas de una tabla / view / rowset_function_limited en función de las filas de otra tabla utilizando otra cláusula FROM. En esa cláusula FROM también puedes escribir condiciones normales de JOIN. En realidad, puede crear una declaración DELETE a partir de una declaración SELECT que no contenga ninguna función agregada reemplazando SELECT con DELETE y eliminando los nombres de columna.
Con TRUNCATE no puedes hacer eso.

DONDE : un TRUNCATE no puede tener condiciones WHERE, pero un DELETE sí. Eso significa que con TRUNCATE no puede eliminar una fila específica o un grupo específico de filas. TRUNCATE TABLE es similar a la instrucción DELETE sin cláusula WHERE.

Rendimiento : TRUNCATE TABLE es más rápido y utiliza menos recursos del sistema y del registro de transacciones. Y una de las razones son los bloqueos utilizados por cualquiera de las declaraciones. La instrucción DELETE se ejecuta utilizando un bloqueo de fila, cada fila de la tabla está bloqueada para su eliminación. TRUNCATE TABLE siempre bloquea la tabla y la página, pero no cada fila.

Registro de transacciones : la instrucción DELETE elimina las filas de una en una y crea entradas individuales en el registro de transacciones para cada fila.
TRUNCATE TABLE elimina los datos al desasignar las páginas de datos utilizadas para almacenar los datos de la tabla y registra solo las desasignaciones de páginas en el registro de transacciones.

Páginas : después de ejecutar una instrucción DELETE, la tabla aún puede contener páginas vacías. TRUNCATE elimina los datos al desasignar las páginas de datos utilizadas para almacenar los datos de la tabla.

Disparador : TRUNCATE no activa los disparadores de eliminación en la tabla. Por lo tanto, debe tener mucho cuidado al usar TRUNCATE. Uno nunca debe usar un TRUNCATE si eliminar Trigger está definido en la tabla para realizar una limpieza automática o una acción de registro cuando se eliminan las filas.

Columna de identidad : con TRUNCATE si la tabla contiene una columna de identidad, el contador de esa columna se restablece al valor inicial definido para la columna. Si no se definió ninguna semilla, se usa el valor predeterminado 1. DELETE no restablece el contador de identidad. Entonces, si desea conservar el contador de identidad, use DELETE en su lugar.

Replicación : DELETE se puede usar contra la tabla utilizada en la replicación transaccional o la replicación de fusión.
Si bien TRUNCATE no se puede usar contra las tablas involucradas en la replicación transaccional o la replicación de fusión.

Revertir : la declaración DELETE puede revertirse.
TRUNCATE también puede revertirse siempre que esté encerrado en un bloque TRANSACTION y la sesión no esté cerrada. Una vez que se cierra la sesión, no podrá deshacer TRUNCATE.

Restricciones : la instrucción DELETE puede fallar si viola un activador o intenta eliminar una fila referenciada por datos en otra tabla con una restricción FOREIGN KEY. Si DELETE elimina varias filas y cualquiera de las filas eliminadas viola un desencadenante o restricción, la declaración se cancela, se devuelve un error y no se eliminan filas.
Y si DELETE se usa contra View, esa vista debe ser una vista actualizable. TRUNCATE no se puede utilizar contra la tabla utilizada en la Vista indizada.
TRUNCATE no se puede usar contra la tabla a la que hace referencia una restricción FOREIGN KEY, a menos que una tabla que tenga una clave foránea que se haga referencia a sí misma.

Mangal Pardeshi
fuente
Hola Mangal: gracias por la respuesta, especialmente por problemas específicos del servidor SQL *. ¿Crees que podrías integrar esos puntos con la respuesta de Wiki de la comunidad que fue aceptada?
David Aldridge
Sí claro, pero ¿cómo y dónde? Lo siento, soy nuevo aquí.
Mangal Pardeshi el
"Entonces, si desea conservar el contador de identidad, use DELETE" podría usarloDECLARE @ai as bigint SET @ai =IDENT_CURRENT('tablename') TRUNCATE TABLE tablename DBCC checkident('tablename', RESEED, @ai)
mpag
1

La mayor diferencia es que truncar es una operación no registrada mientras que eliminar es.

Simplemente significa que en caso de un bloqueo de la base de datos, no puede recuperar los datos operados por truncamiento, pero con la eliminación puede.

Más detalles aquí

Aprendizaje
fuente
1

Declaración DELETE: este comando elimina solo las filas de la tabla en función de la condición dada en la cláusula where o elimina todas las filas de la tabla si no se especifica ninguna condición. Pero no libera el espacio que contiene la tabla.

La sintaxis de una instrucción DELETE de SQL es:

DELETE FROM nombre_tabla [condición WHERE];

Sentencia TRUNCATE: este comando se utiliza para eliminar todas las filas de la tabla y liberar el espacio que contiene la tabla.

Bhushan Patil
fuente
1

ELIMINAR

DELETE is a DML command
DELETE you can rollback
Delete = Only Delete- so it can be rolled back
In DELETE you can write conditions using WHERE clause
Syntax  Delete from [Table] where [Condition]

TRUNCAR

TRUNCATE is a DDL command
You can't rollback in TRUNCATE, TRUNCATE removes the record permanently
Truncate = Delete+Commit -so we can't roll back
You can't use conditions(WHERE clause) in TRUNCATE
Syntax  Truncate table [Table]

Para más detalles visite

http://www.zilckh.com/what-is-the-difference-between-truncate-and-delete/

usuario27332
fuente
1

Otra diferencia de las dos operaciones es que si la tabla contiene una columna de identidad, el contador de esa columna se restablece 1 (o al valor inicial definido para la columna) en TRUNCATE. ELIMINAR no tiene este efecto.

Westyside
fuente
0

En resumen, truncar no registra nada (por lo que es mucho más rápido pero no se puede deshacer), mientras que eliminar se registra (y puede ser parte de una transacción más grande, revertirá, etc.). Si tiene datos que no desea en una tabla en dev, normalmente es mejor truncar ya que no corre el riesgo de llenar el registro de transacciones

Oskar
fuente
0

Una gran razón por la que es útil es cuando necesita actualizar los datos en una tabla de filas de varios millones, pero no desea reconstruirlos. "Eliminar *" llevaría una eternidad, mientras que el impacto de Truncate sería insignificante.

Jordan Ogren
fuente
0

No se puede hacer DDL en un enlace doble.


fuente
0

Comentaría sobre la publicación de Matthieu, pero aún no tengo el representante ...

En MySQL, el contador de incremento automático se restablece con truncar, pero no con eliminar.

Nathan
fuente
0

No es que truncar no registre nada en SQL Server. truncate no registra ninguna información pero registra la desasignación de la página de datos para la tabla en la que activó TRUNCATE.

y el registro truncado puede revertirse si definimos la transacción al principio y podemos recuperar el registro truncado después de revertirlo. Pero no puede recuperar registros truncados de la copia de seguridad del registro de transacciones después de la transacción truncada confirmada.

usuario2587360
fuente
0

Truncar también puede revertirse aquí la exapmle

begin Tran
delete from  Employee

select * from Employee
Rollback
select * from Employee
Vinay Pandit
fuente
0

Truncar y Eliminar en SQL son dos comandos que se utilizan para eliminar o eliminar datos de la tabla. Aunque de naturaleza bastante básica, ambos comandos SQL pueden crear muchos problemas hasta que esté familiarizado con los detalles antes de usarlo. Una elección incorrecta de comando puede resultar en un proceso muy lento o incluso puede explotar el segmento de registro, si es necesario eliminar demasiados datos y el segmento de registro no es suficiente. Es por eso que es fundamental saber cuándo usar el comando truncar y eliminar en SQL, pero antes de usarlos debe conocer las diferencias entre truncar y eliminar, y en función de ellos, deberíamos poder saber cuándo DELETE es la mejor opción para eliminar Los datos o TRUNCATE deben usarse para purgar tablas.

Consulte cheque haga clic aquí

wpzone4u
fuente
0

Al emitir una instrucción TRUNCATE TABLE, le indica a SQL Server que elimine todos los registros de una tabla, sin que se produzca ningún registro o procesamiento de transacciones.

Gerald
fuente
0

La instrucción DELETE puede tener una cláusula WHERE para eliminar registros específicos, mientras que la instrucción TRUNCATE no requiere ninguna y borra toda la tabla. Es importante destacar que la instrucción DELETE registra la fecha eliminada mientras que la instrucción TRUNCATE no.

Ali
fuente
0

Una diferencia más específica para el servidor microsoft sql es deleteque puede usar una outputdeclaración para rastrear qué registros se han eliminado, por ejemplo:

delete from [SomeTable]
output deleted.Id, deleted.Name

No puedes hacer esto con truncate.

Mykhailo Seniutovych
fuente