TRUNCATE

TRUNCATE — esvazia uma tabela ou conjunto de tabelas

Sinopse

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

Descrição

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.

Parâmetros

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 IDENTITY

Reinicia automaticamente as sequências pertencentes às colunas da(s) tabela(s) truncada(s).

CONTINUE IDENTITY

Nã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.

RESTRICT

Recusa 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.

Notas

É 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.

Exemplos

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;

Conformidade

O padrão SQL:2008 inclui o comando TRUNCATE com a sintaxe TRUNCATE TABLE nome_da_tabela. As cláusulas CONTINUE 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.

Veja também

DELETE