TRUNCATE TABLE (Transact-SQL)
Quita todas las filas de una tabla sin registrar las eliminaciones individuales de filas. Desde un punto de vista funcional, TRUNCATE TABLE es equivalente a la instrucción DELETE sin una cláusula WHERE; no obstante, TRUNCATE TABLE es más rápida y utiliza menos recursos de registros de transacciones y de sistema.
Convenciones de sintaxis de Transact-SQL
Sintaxis
TRUNCATE TABLE
[ { database_name.[ schema_name ]. | schema_name . } ]
table_name
[ ; ]
Argumentos
- database_name
Es el nombre de la base de datos.
- schema_name
Es el nombre del esquema al que pertenece la tabla.
- table_name
Es el nombre de la tabla que se va a truncar o de la que se van a quitar todas las filas.
Notas
En comparación con la instrucción DELETE, TRUNCATE TABLE ofrece las siguientes ventajas:
- Se utiliza menos espacio del registro de transacciones.
La instrucción DELETE quita una a una las filas y graba una entrada en el registro de transacciones por cada fila eliminada. TRUNCATE TABLE quita los datos al cancelar la asignación de las páginas de datos utilizadas para almacenar los datos de la tabla y sólo graba en el registro de transacciones las cancelaciones de asignación de páginas. - Por regla general, se utilizan menos bloqueos.
Si se ejecuta la instrucción DELETE con un bloqueo de fila, se bloquea cada fila de la tabla para su eliminación. TRUNCATE TABLE siempre bloquea la tabla y la página, pero no cada fila. - Las páginas cero se conservan en la tabla sin excepciones.
Después de ejecutar una instrucción DELETE, la tabla puede seguir conteniendo páginas vacías. Por ejemplo, no se puede cancelar la asignación de las páginas vacías de un montón sin un bloqueo de tabla exclusivo (LCK_M_X) como mínimo. Si en la operación de eliminación no se utiliza un bloqueo de tabla, la tabla (montón) contiene muchas páginas vacías. En el caso de los índices, la operación de eliminación puede dejar páginas vacías, aunque la asignación de estas páginas se puede cancelar rápidamente mediante un proceso de limpieza en segundo plano.
TRUNCATE TABLE quita todas las filas de una tabla, pero permanecen la estructura y sus columnas, las restricciones, los índices, etc. Para quitar la definición de tabla además de los datos, utilice la instrucción DROP TABLE.
Si la tabla contiene una columna de identidad, el contador para dicha columna se restablece al valor de inicialización definido para ella. Si no se define ningún valor de inicialización, se utiliza el valor predeterminado 1. Para conservar el contador de identidad, utilice DELETE.
Restricciones
No puede utilizar TRUNCATE TABLE en las siguientes tablas:
- Tablas a las que se hace referencia mediante una restricción FOREIGN KEY.
- Tablas que participan en una vista indizada.
- Tablas que se publican mediante réplica transaccional o réplica de mezcla.
En el caso de las tablas con una o más de estas características, utilice la instrucción DELETE.
TRUNCATE TABLE no puede activar un desencadenador porque la operación no registra eliminaciones de filas individuales. Para obtener más información, vea CREATE TRIGGER (Transact-SQL).
Truncar tablas de gran tamaño
Microsoft SQL Server 2005 ofrece la posibilidad de quitar o truncar las tablas con más de 128 extensiones sin mantener bloqueos simultáneos en todas las extensiones necesarias para la eliminación. Para obtener más información, vea Quitar y volver a generar objetos grandes.
Permisos
El permiso mínimo necesario es ALTER en table_name. Los permisos predeterminados de TRUNCATE TABLE son los de propietario de la tabla, los miembros de la función fija de servidor sysadmin y los miembros de las funciones fijas de base de datos db_owner y db_ddladmin, y no son transferibles. No obstante, puede incorporar la instrucción TRUNCATE TABLE en un módulo, por ejemplo un procedimiento almacenado, y conceder los permisos correspondientes al módulo mediante la cláusula EXECUTE AS. Para obtener más información, vea Usar EXECUTE AS para crear conjuntos de permisos personalizados.
Ejemplos
En el siguiente ejemplo se quitan todos los datos de la tabla JobCandidate
. Las instrucciones SELECT se incluyen antes y después de la instrucción TRUNCATE TABLE para comparar los resultados.
USE AdventureWorks;
GO
SELECT COUNT(*) AS BeforeTruncateCount
FROM HumanResources.JobCandidate;
GO
TRUNCATE TABLE HumanResources.JobCandidate;
GO
SELECT COUNT(*) AS AfterTruncateCount
FROM HumanResources.JobCandidate;
GO
Vea también
Referencia
DELETE (Transact-SQL)
DROP TABLE (Transact-SQL)
IDENTITY (propiedad de Transact-SQL)
Otros recursos
Arquitectura física del registro de transacciones
Bloquear el motor de base de datos