Diferença entre DROP e TRUNCATE


8

O que faz o TRUNCATEdiferente de cair?

Eu acredito que ele apaga todos os dados da tabela, mas mantém o nome da tabela no banco de dados, onde como DROPexclui todos os dados e a tabela. Isso está correto?


Relacionados (e provavelmente muitos dos conceitos serão semelhantes ou idênticos, mesmo que nem todos os detalhes sejam): dba.stackexchange.com/questions/30325/delete-vs-truncate
Aaron Bertrand

Respostas:


22

EXCLUIR - IDIOMA DE MANIPULAÇÃO DE DADOS (DML)

A DELETEdeclaração em qualquer RDBMS é considerada uma declaração DML . Também conhecido como CRUD (Criar, Ler, Atualizar, Excluir), esse tipo de instrução destina-se a manipular dados em um banco de dados sem afetar a estrutura subjacente dos objetos. O que isso significa em termos práticos é:

  • Uma DELETEinstrução pode ser ajustada usando um predicado por meio de WHEREou JOINpara excluir algumas ou todas as linhas de uma tabela.
  • Uma DELETEinstrução será registrada pelo banco de dados e poderá ser revertida em uma transação se a instrução falhar.
  • Normalmente, um DELETEleva bloqueios no nível da linha nos dados que são excluídos, embora isso possa aumentar conforme necessário.
  • Por causa da sobrecarga transacional, DELETEpode ser "lento" (isso é relativo), mas mais seguro porque é refinado.

TRUNCATE - IDIOMA DE DEFINIÇÃO DE DADOS (DDL)

TRUCNATEé considerada uma instrução DDL , o que significa que se destina a alterar como os objetos são definidos em um banco de dados. Geralmente, as instruções DDL são CREATE, ALTERou DROP, mas TRUNCATEservem a um propósito específico, o de "redefinir" uma tabela removendo todas as linhas. Os métodos disso diferem entre os mecanismos RDBMS e eu recomendaria examinar as especificidades do MySQL . As implicações práticas de a TRUNCATEsão:

  • TRUNCATEnão pode ser refinado. Se for bem-sucedido, ele removerá todas as linhas da sua tabela.
  • TRUNCATEnormalmente não está registrado. Isso varia de acordo com o RDBMS e eu sugiro que você analise mais especificamente como o MySQL lida com isso. (Dica, isso varia de acordo com a versão.)
  • TRUNCATErequer um bloqueio de metadados da tabela para executar. Como isso é realmente implementado pode ser específico para o RDBMS, mas essencialmente o TRUNCATEprocesso deve impedir que outros processos atrapalhem a tabela para executar sua DDL.
  • Como geralmente não é registrado e não usa predicados, a TRUNCATEserá mais rápido que o DELETE, mas menos seguro.

TABELA DE QUEDA - IDIOMA DE DEFINIÇÃO DE DADOS (DDL)

DROP TABLEvai além de um, TRUNCATEna verdade ele remove a tabela do banco de dados completamente. Isso inclui remover todos os objetos associados, como índices e restrições. Se você soltasse uma tabela, não apenas removeria todos os dados, mas também a estrutura. Isso geralmente será feito quando uma tabela não for mais necessária. A principal preocupação é que, como a DROPé DDL, você normalmente não pode desfazê-lo . Alguns mecanismos RDBMS permitem agrupar o DDL em uma transação para que você possa recuperá-lo, mas isso não é considerado uma prática recomendada e deve ser evitado.


11
Eu acrescentaria que TRUNCATE redefine o contador de incremento automático da tabela.
DanMan 24/05

5

Embora eu não possa falar pelo MySQL, aqui está uma tabela rápida comparando alguns aspectos de truncar versus excluir no Oracle.

truncate                             |   delete
---------------------------------    |   ---------------------------
DDL   (implicitly commits,           |   DML
    including any pending DML)       |  
Does not generate undo info          |   Generates undo info
    (rollback statements)            |       (rollback statements)
Resets high water mark in table      |   Does not affect full-scan 
    and all indexes, improving       |       performance
    full-scan performance            |      
Does not fire any delete triggers    |   Fires delete triggers
Priv to truncate cannot be granted   |   --
    to truncate another user's       |  
    table; DROP ANY TABLE system     |   
    priv required                    |      
Storage for table and indexes can    |   Never shrinks the size of a 
    be set to initial size           |       table or indexes
Cannot truncate parent table from    |   --
    an established referential       |  
    integrity constraint; must       |  
    first disable foreign key        |  
    that references the parent       |  
    table                            |  

Informações compiladas deste livro: http://amzn.com/0470395125

Espero que isso ajude os usuários do Oracle que tropeçam nessa página, como eu fiz. Por favor, sinta-se à vontade para apontar quais desses pontos, se houver, são verdadeiros no MySQL,


2

DROP TABLE TableName -> exclua a tabela do banco de dados.

TRUNCATE TABLE TableName-> exclua os dados da tabela, incondicionalmente ... e redefina o IDENTITYvalor inicial, se a tabela tiver um IDENTITYcampo.


1
  • DELETE: Comando DML, se você executar o comando delete, remova os únicos DATA sem despir a tabela Estrutura, podemos ROLLBACK os dados linha por linha

  • TRUNCATE: Comando DDL, se você executar o comando Truncar remover os únicos DADOS sem despir a tabela Estrutura, não podemos reverter os dados truncar remover os dados de uma maneira PAGE BY PAGE

  • DROP:, Comando DDL, se você executar o comando DROP, excluir (remover) os dados e a estrutura total da tabela também não podemos reverter os dados

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.