DELETE X TRUNCATE
Existem dúvidas básicas que nos assolam durante o nosso dia-a-dia e neste artigo vamos abordar uma delas.
Primeiramente para testarmos e acompanharmos tudo criaremos uma tabela e vamos colocar dados nela.
CREATE TABLE TESTE ( NUMERO INT );
DECLARE
NUM NUMBER := 0;
BEGIN
FOR i in 0..10000
LOOP
INSERT INTO TESTE VALUES (NUM);
NUM := NUM + 1;
END LOOP;
commit;
END;
De acordo com o script executado nós inserimos na tabela 10001 registros, pois a posição 0 também conta. Durante nosso estudo usaremos muito o seguinte SQL para verificarmos quantos registros temos na tabela TESTE.
select count(*) from teste;
Vamos então a parte que nos interessa, começando pelo DELETE.
Esse comando é um comando do tipo DML, onde conseguimos excluir dados de tabelas. Ele pode ter o uso da cláusula WHERE para que somente uma parte dos dados seja excluída.
OBS: a palavra FROM é opicional. ex DELETE FROM TABELA OU DELETE TABELA.
Bom vamos ver o comportamento que a tabela teste tem se executarmos um delete para excluir do numero 0 ao 5000.
delete teste t where t.numero between 0 and 5000
Pronto, vamos agora executar o comando ROLLBACK que vai fazer a reversão de nossa exclusão e executar novamente o SQL para vermos a quantidade de registros. Muito bem, agora estamos com todos os dados na tabela novamente, se você quiser excluir de fato sem fazer a reversão execute um COMMIT;
Mas e o TRUNCATE como funciona? O TRUNCATE é um comando DDL, é um comando bem mais rápido em performace do que o DELETE, pois com ele as posições de HWM são zeradas, fazendo com o que o resultado final seja quase igual ao do DELETE (o esvaziamento da tabela). Como ele não gera registros no redo log, o comando não aceita um ROLLBACK. Então muito cuidado ao utilizar esse comando. Nele também não temos a opção de usar a cláusula WHERE, ou seja, não há como excluir apenas uma parte dos dados.
Vamos executar e ver qual seu resultado.
TRUNCATE TABLE TESTE;
E novamente execute o nosso SQL para contar os registros. Bem simples né!? Podemos ir mais afundo no assunto, porém nesse artigo vimos de maneira básica a diferença entre esses dois comandos.
Um grande abraço