TRUNCATE — esvazia uma tabela ou conjunto de tabelas
TRUNCATE [ TABLE ] [ ONLY ] nome_da_tabela [ * ] [, ... ]
[ RESTART IDENTITY | CONTINUE IDENTITY ]
[ CASCADE | RESTRICT ]
O comando TRUNCATE remove rapidamente todas as
linhas de um conjunto de tabelas.
Tem o mesmo efeito que o comando DELETE não
qualificado em cada tabela, mas como não varre as tabelas,
é mais rápido.
Além disso, recupera espaço em disco imediatamente, em vez de exigir
uma operação de VACUUM subsequente.
Este comando é mais útil em tabelas grandes.
nome_da_tabela
O nome (opcionalmente qualificado pelo esquema) da tabela a ser
truncada.
Se for especificado ONLY antes do nome da
tabela, somente esta tabela será truncada.
Se não for especificado ONLY, também serão
truncadas todas as suas tabelas descendentes, se existirem.
Como opção, pode ser especificado um * após o
nome da tabela, para indicar explicitamente que as tabelas
descendentes estão incluídas.
RESTART IDENTITYReinicia automaticamente as sequências pertencentes às colunas da(s) tabela(s) truncada(s).
CONTINUE IDENTITYNão altera os valores das sequências. Este é o comportamento padrão.
CASCADE
Trunca automaticamente todas as tabelas que possuem referências
de chave estrangeira para qualquer uma das tabelas listadas,
ou para quaisquer tabelas adicionadas ao grupo devido a
CASCADE.
RESTRICTRecusa truncar se alguma das tabelas tiver referência de chave estrangeira de tabelas que não estejam listadas no comando. Este é o comportamento padrão.
É necessário ter o privilégio TRUNCATE na tabela
para poder truncá-la.
O comando TRUNCATE adquire o bloqueio
ACCESS EXCLUSIVE em cada tabela em que opera,
o que bloqueia todas as outras operações concorrentes na tabela.
Quando é especificado RESTART IDENTITY, todas as
sequências que devem ser reiniciadas também são bloqueadas
exclusivamente.
Se for necessário acesso simultâneo à tabela, então deve ser usado
o comando DELETE.
O comando TRUNCATE não pode ser usado em uma
tabela que tenha referências de chave estrangeira de outras tabelas,
a menos que estas tabelas também sejam truncadas no mesmo comando.
Caso contrário, nesses casos a verificação da validade exigiria
varreduras de tabela, que não é o objetivo do comando
TRUNCATE.
A opção CASCADE pode ser usada para incluir
automaticamente todas as tabelas dependentes — mas deve-se ter
muito cuidado ao usar esta opção, ou pode-se perder dados que não se
pretendia perder!
Note em particular que quando a tabela a ser truncada é uma partição,
as partições irmãs não são afetadas, porém, a cascata ocorre para
todas as tabelas que fazem referência e todas as suas partições sem
distinção.
O comando TRUNCATE não dispara nenhum gatilho
ON DELETE que possa existir para as tabelas.
Mas dispara gatilhos ON TRUNCATE.
Se forem definidos gatilhos ON TRUNCATE para
qualquer uma das tabelas, então todos os gatilhos
BEFORE TRUNCATE serão disparados antes que qualquer
truncamento aconteça, e todos os gatilhos
AFTER TRUNCATE serão disparados depois que o último
truncamento for executado e todas as sequências forem redefinidas.
Os gatilhos serão disparados na ordem em que as tabelas deverão ser
processadas (primeiro aqueles listados no comando e, em seguida,
aqueles que foram adicionados devido à cascata).
O comando TRUNCATE não é seguro quanto a
Controle de concorrência.
Após o truncamento, a tabela aparecerá vazia para transações
concorrentes, se estiverem usando um instantâneo obtido antes
do truncamento.
Veja Advertências para obter mais detalhes.
O comando TRUNCATE é seguro quanto a transação
em relação aos dados nas tabelas: o truncamento será desfeito com
segurança se a transação envolvente não for efetivada.
Quando é especificado RESTART IDENTITY, as
operações ALTER SEQUENCE RESTART implícitas também
são feitas de forma transacional; ou seja, elas serão desfeitas se a
transação envolvente não for efetivada.
Esteja ciente de que se forem feitas quaisquer operações de sequência
adicionais nas sequências reiniciadas, antes da transação ser desfeita,
os efeitos dessas operações nas sequências serão desfeitos, mas não
seus efeitos em currval(); ou seja, após a
transação currval() continuará a refletir o
último valor de sequência obtido dentro da transação falhada,
mesmo que a sequência em si não seja mais consistente com isto.
É semelhante ao comportamento normal de currval()
após uma transação falhada.
O comando TRUNCATE pode ser usado para tabelas
estrangeiras se suportado pelo empacotador de dados estrangeiros.
Para exemplo, veja postgres_fdw.
Truncar as tabelas bigtable e
fattable:
TRUNCATE bigtable, fattable;
O mesmo, também redefinindo quaisquer geradores de sequência associados:
TRUNCATE bigtable, fattable RESTART IDENTITY;
Truncar a tabela othertable e propagar em
cascata para todas as tabelas que fazem referência a
othertable por meio de restrições de
chave estrangeira:
TRUNCATE othertable CASCADE;
O padrão SQL:2008 inclui o comando TRUNCATE
com a sintaxe
TRUNCATE TABLE .
As cláusulas
nome_da_tabelaCONTINUE IDENTITY/RESTART IDENTITY
também aparecem no padrão, mas têm significados ligeiramente
diferentes, embora relacionados.
Parte do comportamento de concorrência desse comando é deixado a ser
definido pela implementação pelo padrão, portanto, as notas acima
devem ser consideradas e comparadas com outras implementações,
se necessário.