TRUNCATE — vacía una tabla o un conjunto de tablas
TRUNCATE [ TABLE ] [ ONLY ] name [ * ] [, ... ]
[ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]
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.
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 IDENTITYRestablece automáticamente las secuencias propiedad de las columnas de las tablas vaciadas.
CONTINUE IDENTITYNo 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.
RESTRICTRechaza 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.
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.
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;
El estándar SQL:2008 incluye un comando TRUNCATE con la sintaxis
TRUNCATE TABLE . Las cláusulas
tablenameCONTINUE 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.