TRUNCATE

TRUNCATE — vacía una tabla o un conjunto de tablas

Synopsis

TRUNCATE [ TABLE ] [ ONLY ] name [ * ] [, ... ]
    [ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]

Descripción

TRUNCATE elimina rápidamente todas las filas de un conjunto de tablas. Tiene el mismo efecto que un DELETE sin calificar en cada tabla, pero dado que no escanea realmente las tablas, es más rápido. Además, reclama el espacio en disco inmediatamente, en lugar de requerir una operación posterior de VACUUM. Esto es extremadamente útil en tablas grandes.

Parámetros

name

El nombre (opcionalmente calificado por esquema) de la tabla a vaciar. Si se especifica ONLY antes del nombre de la tabla, solo se vacía esa tabla. Si no se especifica ONLY, se vacían la tabla y todas sus tablas descendientes (si las hay). Opcionalmente, se puede especificar * después del nombre de la tabla para indicar explícitamente que se incluyen las tablas descendientes.

RESTART IDENTITY

Restablece automáticamente las secuencias propiedad de las columnas de las tablas vaciadas.

CONTINUE IDENTITY

No cambia los valores de las secuencias. Este es el valor por defecto.

CASCADE

Vacía automáticamente todas las tablas que tienen referencias de clave foránea a cualquiera de las tablas especificadas, o a cualquier tabla agregada al grupo debido a CASCADE.

RESTRICT

Rechaza el vaciado si alguna de las tablas tiene referencias de clave foránea desde tablas que no están listadas en el comando. Este es el valor por defecto.

Notas

Debes tener el privilegio TRUNCATE en una tabla para poder vaciarla.

TRUNCATE adquiere un bloqueo ACCESS EXCLUSIVE en cada tabla sobre la que opera, lo que bloquea todas las demás operaciones concurrentes en la tabla. Cuando se especifica RESTART IDENTITY, las secuencias que se van a reiniciar también se bloquean exclusivamente. Si se requiere acceso concurrente a una tabla, se debe utilizar el comando DELETE en su lugar.

TRUNCATE no se puede utilizar en una tabla que tenga referencias de clave foránea desde otras tablas, a menos que todas esas tablas también se vacíen en el mismo comando. Comprobar la validez en tales casos requeriría escaneos de tablas, y el punto es no hacerlo. La opción CASCADE se puede utilizar para incluir automáticamente todas las tablas dependientes; ¡pero ten mucho cuidado al usar esta opción, de lo contrario podrías perder datos que no tenías la intención de borrar! Ten en cuenta en particular que cuando la tabla a vaciar es una partición, las particiones hermanas no se modifican, pero la cascada se propaga a todas las tablas que la referencian y a todas sus particiones sin distinción.

TRUNCATE no disparará ningún disparador («trigger») de tipo ON DELETE que pueda existir para las tablas. Pero sí disparará disparadores ON TRUNCATE. Si se definen disparadores ON TRUNCATE para cualquiera de las tablas, todos los disparadores BEFORE TRUNCATE se disparan antes de que ocurra cualquier vaciado, y todos los disparadores AFTER TRUNCATE se disparan después de que se realiza el último vaciado y se reinicia cualquier secuencia. Los disparadores se dispararán en el orden en que se procesarán las tablas (primero las enumeradas en el comando y luego las que se agregaron debido a la cascada).

TRUNCATE no es seguro bajo MVCC. Después del vaciado, la tabla aparecerá vacía para las transacciones concurrentes, si estas utilizan una instantánea («snapshot») tomada antes de que ocurriera el vaciado. Consulta la Section 13.6 para obtener más detalles.

TRUNCATE es seguro para transacciones con respecto a los datos en las tablas: el vaciado se revertirá de forma segura si la transacción contenedora no se confirma.

Cuando se especifica RESTART IDENTITY, las operaciones implícitas ALTER SEQUENCE RESTART también se realizan transaccionalmente; es decir, se revertirán si la transacción contenedora no se confirma. Ten en cuenta que si se realiza cualquier operación adicional en las secuencias reiniciadas antes de que la transacción se revierta, los efectos de estas operaciones en las secuencias se revertirán, pero no sus efectos en currval(); es decir, después de la transacción, currval() continuará reflejando el último valor de secuencia obtenido dentro de la transacción fallida, aunque la secuencia en sí ya no sea consistente con eso. Esto es similar al comportamiento habitual de currval() después de una transacción fallida.

TRUNCATE se puede utilizar para tablas foráneas si lo admite el conector de datos foráneos (Fdw), por ejemplo, consulta la postgres_fdw.

Ejemplos

Vacía las tablas bigtable y fattable:

TRUNCATE bigtable, fattable;

Lo mismo, y también reinicia cualquier generador de secuencias asociado:

TRUNCATE bigtable, fattable RESTART IDENTITY;

Vacía la tabla othertable y propaga en cascada a cualquier tabla que referencie othertable a través de restricciones de clave foránea:

TRUNCATE othertable CASCADE;

Compatibilidad

El estándar SQL:2008 incluye un comando TRUNCATE con la sintaxis TRUNCATE TABLE tablename. Las cláusulas CONTINUE IDENTITY/RESTART IDENTITY también aparecen en ese estándar, pero tienen significados ligeramente diferentes aunque relacionados. Parte del comportamiento de concurrencia de este comando se deja definido por la implementación según el estándar, por lo que las notas anteriores deben considerarse y compararse con otras implementaciones si es necesario.

Véase también

DELETE