Qual é a diferença entre TRUNCATE e DELETE no SQL

303

Qual é a diferença entre TRUNCATEe DELETEno SQL?

Se sua resposta for específica da plataforma, indique isso.

David Aldridge
fonte
4
Todas as respostas são específicas da plataforma. Não há comando TRUNCATE no SQL padrão. É, portanto, um recurso proprietário e significa algo diferente para cada fornecedor de DBMS.
Nvogel 08/07
A resposta é muito específica da implementação, como deve ser, pois, como o sqlvogel apontou, este é um comando não padrão (TRUNCATE). Quer deixar esta marcado 'oráculo' ou vamos torná-lo uma resposta estilo comunidade wiki, e colocar nas conseqüências para cada grande RDBMS (Oracle, MS-MSQL, PostgreSQL tudo implementar TRUNCATE ...)
reedstrm
Se a transação for concluída, significa COMMITED, não será possível reverter o comando TRUNCATE, mas ainda podemos reverter o comando DELETE a partir dos arquivos de LOG, pois DELETE write os grava no arquivo de Log, caso seja necessário reverter futuramente a partir dos arquivos de LOG.

Respostas:

272

Aqui está uma lista de diferenças. Eu destaquei os recursos específicos da Oracle e espero que a comunidade possa adicionar também a diferença específica de outros fornecedores. As diferenças comuns à maioria dos fornecedores podem ir diretamente abaixo dos títulos, com as diferenças destacadas abaixo.


Visao geral

Se você deseja excluir rapidamente todas as linhas de uma tabela e tem certeza de que deseja fazê-lo e não possui chaves estrangeiras nas tabelas, um TRUNCATE provavelmente será mais rápido que um DELETE .

Vários problemas específicos do sistema devem ser considerados, conforme detalhado abaixo.


Tipo de instrução

Excluir é DML, truncar é DDL (o que é DDL e DML? )


Confirmar e reverter

Variável por fornecedor

Servidor SQL

Truncar pode ser revertido.

PostgreSQL

Truncar pode ser revertido.

Oráculo

Como um TRUNCATE é DDL, ele envolve duas confirmações, uma antes e outra após a execução da instrução. Portanto, o truncamento não pode ser revertido e uma falha no processo de truncamento emitirá uma confirmação de qualquer maneira.

No entanto, consulte o Flashback abaixo.


Recuperação de espaço

Excluir não recupera espaço, Truncar recupera espaço

Oráculo

Se você usar a cláusula REUSE STORAGE, os segmentos de dados não serão desalocados, o que pode ser marginalmente mais eficiente se a tabela precisar ser recarregada com dados. A marca d'água alta é redefinida.


Escopo da linha

Excluir pode ser usado para remover todas as linhas ou apenas um subconjunto de linhas. Truncar remove todas as linhas.

Oráculo

Quando uma tabela é particionada, as partições individuais podem ser truncadas isoladamente, portanto, é possível uma remoção parcial de todos os dados da tabela.


Tipos de objeto

A exclusão pode ser aplicada a tabelas e tabelas dentro de um cluster. Truncar se aplica apenas a tabelas ou a todo o cluster. (Pode ser específico do Oracle)


Identidade do objeto de dados

Oráculo

Excluir não afeta o ID do objeto de dados, mas truncar atribui um novo ID de objeto de dados, a menos que nunca tenha havido uma inserção na tabela desde a sua criação. Mesmo uma única inserção revertida fará com que um novo ID de objeto de dados seja atribuído no truncamento. .


Flashback (Oracle)

O flashback funciona através de exclusões, mas um truncado impede o flashback para estados anteriores à operação.

No entanto, a partir do 11gR2, o recurso ARQUIVO FLASHBACK permite isso, exceto no Express Edition

Uso do FLASHBACK no Oracle http://docs.oracle.com/cd/E11882_01/appdev.112/e41502/adfns_flashback.htm#ADFNS638


Privilégios

Variável

Oráculo

A exclusão pode ser concedida em uma tabela a outro usuário ou função, mas não pode ser truncado sem o uso de uma concessão DROP ANY TABLE.


Refazer / Desfazer

Excluir gera uma pequena quantidade de refazer e uma grande quantidade de desfazer. Truncar gera uma quantidade desprezível de cada um.


Índices

Oráculo

Uma operação truncada torna índices inutilizáveis ​​utilizáveis ​​novamente. Excluir não.


Chaves estrangeiras

Um truncado não pode ser aplicado quando uma chave estrangeira ativada faz referência à tabela. O tratamento com exclusão depende da configuração das chaves estrangeiras.


Travamento da mesa

Oráculo

Truncar requer um bloqueio de tabela exclusivo, a exclusão requer um bloqueio de tabela compartilhado. Portanto, desativar os bloqueios de tabela é uma maneira de impedir operações truncadas em uma tabela.


Gatilhos

Os gatilhos DML não são acionados em um truncado.

Oráculo

Os gatilhos DDL estão disponíveis.


Execução Remota

Oráculo

Truncar não pode ser emitido por um link de banco de dados.


Colunas de identidade

Servidor SQL

Truncar redefine a sequência para os tipos de coluna IDENTITY, excluir não.


Conjunto de resultados

Na maioria das implementações, uma DELETEinstrução pode retornar ao cliente as linhas que foram excluídas.

Por exemplo, em um subprograma Oracle PL / SQL, você pode:

DELETE FROM employees_temp
WHERE       employee_id = 299 
RETURNING   first_name,
            last_name
INTO        emp_first_name,
            emp_last_name;
David Aldridge
fonte
Não entenda sua quarta declaração: se eu disser DELETE [ ] FROM Table; então * todas as linhas nessa tabela serão excluídas, a menos que um FK a interrompa. A propósito, acho que isso é específico do SQL Server, você não pode usar TRUNCATE em tabelas com FKs.
Joe Pineda
Mais alguns comentários: Não concordo com a sua terceira declaração, a menos que seja específica da Oracle. Pelo menos com o SQL S., se você EXCLUIR ou TRUNCAR, não recuperará espaço (ou seja, os arquivos do banco de dados não encolhem no disco rígido), a menos que você solicite especificamente.
31909 Joe Pineda
1
Declaração 5TH: você pode reverter um TABLE TRUNCATE no SQL 2008 R2
Eric Labashosky
1
O Postgresql pode reverter um TRUNCATE e, portanto, também não o confirma automaticamente.
Rfusca
5
DELETE retorna o número de linhas excluídas, mas TRUNCATE não. É ponto muito bobo, mas vale a pena mencionar que :)
Deepak Kumar Jha
191

A diferença entre truncar e excluir está listada abaixo:

+----------------------------------------+----------------------------------------------+
|                Truncate                |                    Delete                    |
+----------------------------------------+----------------------------------------------+
| We can't Rollback after performing     | We can Rollback after delete.                |
| Truncate.                              |                                              |
|                                        |                                              |
| Example:                               | Example:                                     |
| BEGIN TRAN                             | BEGIN TRAN                                   |
| TRUNCATE TABLE tranTest                | DELETE FROM tranTest                         |
| SELECT * FROM tranTest                 | SELECT * FROM tranTest                       |
| ROLLBACK                               | ROLLBACK                                     |
| SELECT * FROM tranTest                 | SELECT * FROM tranTest                       |
+----------------------------------------+----------------------------------------------+
| Truncate reset identity of table.      | Delete does not reset identity of table.     |
+----------------------------------------+----------------------------------------------+
| It locks the entire table.             | It locks the table row.                      |
+----------------------------------------+----------------------------------------------+
| Its DDL(Data Definition Language)      | Its DML(Data Manipulation Language)          |
| command.                               | command.                                     |
+----------------------------------------+----------------------------------------------+
| We can't use WHERE clause with it.     | We can use WHERE to filter data to delete.   |
+----------------------------------------+----------------------------------------------+
| Trigger is not fired while truncate.   | Trigger is fired.                            |
+----------------------------------------+----------------------------------------------+
| Syntax :                               | Syntax :                                     |
| 1) TRUNCATE TABLE table_name           | 1) DELETE FROM table_name                    |
|                                        | 2) DELETE FROM table_name WHERE              |
|                                        |    example_column_id IN (1,2,3)              |
+----------------------------------------+----------------------------------------------+
Bhaumik Patel
fonte
Truncar a identidade de redefinição da tabela O que isso significa? Mas, o que dizer de Excluir?
Ravi
1
@jWeaver: significa que quando você define a propriedade Especificação de identidade como True para o campo Chave primária, portanto, quando você insere dados nessa tabela, a coluna da chave primária mantém um valor como 1,2,3,4,5 .... (se a Identity iniciar from 1 e seed é 1) e, quando você truncar a tabela, perderá todo o valor da identidade; portanto, quando você começar a inserir dados nessa tabela novamente, começará a partir de 1 em vez de onde ficou por último. Em DELETE, é reverso, preserva o valor da identidade mesmo após a execução da instrução DELETE. Desculpe pelo erro do segundo ponto de comparação na coluna DELETE na imagem acima.
Bhaumik Patel
Parece que você está respondendo para SQL SERVER
Ravi
4
TRUNCATE e DELETE podem ser revertidos no SQL SERVER . E na 2ª linha DELETE dose não redefinir identidade. Agora, como você pode editar esta postagem? Essa é a coisa ruim de usar imagens no StackOverflow.
Mahmood Jenami
2
Truncar está sendo revertido! (SQL SERVER)
Aimal Khan
55

SOLTA

O comando DROP remove uma tabela do banco de dados. Todas as linhas, índices e privilégios das tabelas também serão removidos. Nenhum gatilho DML será acionado. A operação não pode ser revertida.

TRUNCAR

TRUNCATE remove todas as linhas de uma tabela. A operação não pode ser revertida e nenhum acionador será acionado. Dessa forma, TRUNCATE é mais rápido e não usa tanto espaço para desfazer quanto um DELETE. O bloqueio no nível da tabela será adicionado ao truncar.

EXCLUIR

O comando DELETE é usado para remover linhas de uma tabela. Uma cláusula WHERE pode ser usada para remover apenas algumas linhas. Se nenhuma condição WHERE for especificada, todas as linhas serão removidas. Depois de executar uma operação DELETE, você precisa COMITAR ou ROLLBACK a transação para tornar a alteração permanente ou desfazê-la. Observe que esta operação fará com que todos os gatilhos DELETE na tabela sejam acionados. O bloqueio no nível da linha será adicionado ao excluir.

De: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands

Mohit Singh
fonte
5
Boa explicação para um iniciante como eu
Vikas Kukreti
Curto e doce
ABH
23

Todas as boas respostas, às quais devo acrescentar:

Como TRUNCATE TABLEé um comando DDL ( Data Defination Language ), não um DML ( Data Manipulation Langauge ), o comando Delete Triggersnão é executado.

polara
fonte
Ah, gatilhos ... esse é um bom ponto. Vou acrescentar isso à lista que fiz e creditar Polara, se estiver tudo bem.
David Aldridge
O SQL Server não permitirá que você trunque uma tabela com chaves estrangeiras; portanto, seu ponto em cascata pode ser discutível, dependendo da plataforma.
Meff 26/09/08
O PostgreSQL possui um "TRUNCATE Trigger"
a_horse_with_no_name
17

Com o SQL Server ou MySQL, se houver uma PK com incremento automático, o truncado redefinirá o contador.

mathieu
fonte
Para esclarecer, isso é para o SQL Server se a tabela tiver uma coluna definida como IDENTITY. Excluir manteria o último ID atribuído automaticamente, enquanto Truncar redefine o contador.
Codewerks
Como a pergunta é marcada como ORACLE, essa resposta está ERRADA, portanto, com voto negativo.
Guy
oops, não vi a tag oracle :) #
mathieu
+1 verdadeiro e redefine para 0 . Se você quiser que seja 1, em vez disso:DBCC CHECKIDENT (table_name, RESEED, 1)
JohnB 06/08
Eu adicionei este para a resposta da comunidade, e fez dele um pouco mais amigável para documentar questões específicas de fornecedor
David Aldridge
12

"Truncar não registra nada" está correto. Eu iria além:

Truncar não é executado no contexto de uma transação.

A vantagem da velocidade de truncar sobre excluir deve ser óbvia. Essa vantagem varia de trivial a enorme, dependendo da sua situação.

No entanto, vi truncados involuntariamente quebrar a integridade referencial e violar outras restrições. O poder que você ganha ao modificar dados fora de uma transação deve ser balanceado com a responsabilidade que você herdou ao andar na corda bamba sem rede.

Walter Mitty
fonte
7

TRUNCATEé a instrução DDL, enquanto DELETEé uma instrução DML. Abaixo estão as diferenças entre os dois:

  1. Como TRUNCATEé uma instrução DDL ( Linguagem de definição de dados ), ela não requer confirmação para tornar as alterações permanentes. E é por esse motivo que as linhas excluídas por truncado não puderam ser revertidas. Por outro lado, DELETEhá uma declaração DML ( Data manipulation language ), portanto, exige confirmação explícita para tornar seu efeito permanente.

  2. TRUNCATEsempre remove todas as linhas de uma tabela, deixando a tabela vazia e a estrutura da tabela intacta, enquanto DELETEpode remover condicionalmente se a cláusula where for usada.

  3. As linhas excluídas pela TRUNCATE TABLEinstrução não podem ser restauradas e você não pode especificar a cláusula where na TRUNCATEinstrução.

  4. TRUNCATEAs instruções não acionam gatilhos em vez de no gatilho de exclusão na DELETEinstrução

Aqui está o link muito bom relevante para o tópico.

Sachin Chourasiya
fonte
6

Sim, DELETE é mais lento, TRUNCATE é mais rápido. Por quê?

DELETE deve ler os registros, verificar restrições, atualizar o bloco, atualizar índices e gerar refazer / desfazer. Tudo isso leva tempo.

TRUNCATE simplesmente ajusta um ponteiro no banco de dados para a tabela (a marca d'água alta) e o poof! os dados se foram.

Isso é específico do Oracle, AFAIK.

DCookie
fonte
O PostgreSQL também é semelhante a isso.
Gavin M. Roy
6

TRUNCAR

TRUNCATE A consulta SQL remove todas as linhas de uma tabela, sem registrar as exclusões de linhas individuais.

  • TRUNCATE é um comando DDL.
  • TRUNCATE é executado usando um bloqueio de tabela e a tabela inteira é bloqueada para remover todos os registros.
  • Não podemos usar a cláusula WHERE com TRUNCATE.
  • TRUNCATE remove todas as linhas de uma tabela.
  • Registro mínimo no log de transações, portanto, é mais rápido em termos de desempenho.
  • TRUNCATE TABLE remove os dados desalocando as páginas de dados usadas para armazenar os dados da tabela e registra apenas as desalocações da página no log de transações.
  • Para usar Truncar em uma tabela, você precisa pelo menos da permissão ALTER na tabela.
  • Truncar usa menos espaço de transação que a instrução Delete.
  • Truncar não pode ser usado com visualizações indexadas.
  • TRUNCATE é mais rápido que DELETE.

EXCLUIR

Para executar uma fila DELETE, são necessárias permissões de exclusão na tabela de destino. Se você precisar usar uma cláusula WHERE em um DELETE, também serão necessárias permissões de seleção.

  • DELETE é um comando DML.
  • DELETE é executado usando um bloqueio de linha, cada linha da tabela é bloqueada para exclusão.
  • Podemos usar a cláusula where com DELETE para filtrar e excluir registros específicos.
  • O comando DELETE é usado para remover linhas de uma tabela com base na condição WHERE.
  • Ele mantém o log, portanto, mais lento que TRUNCATE.
  • A instrução DELETE remove as linhas uma por vez e registra uma entrada no log de transações para cada linha excluída.
  • A identidade da coluna keep DELETE mantém a identidade.
  • Para usar Excluir, você precisa da permissão DELETE na tabela.
  • Excluir usa mais espaço de transação que a instrução Truncar.
  • Excluir pode ser usado com visualizações indexadas.
Purvi Barot
fonte
5

Se acidentalmente você removeu todos os dados da tabela usando Excluir / Truncar. Você pode reverter a transação confirmada. Restaure o último backup e execute o log de transações até o momento em que Excluir / Truncar está prestes a acontecer.

As informações relacionadas abaixo são de uma postagem de blog :

Enquanto trabalhamos no banco de dados, estamos usando Excluir e Truncar sem conhecer as diferenças entre eles. Neste artigo, discutiremos a diferença entre Excluir e Truncar no Sql.

Excluir:

  • Excluir é um comando DML.
  • A instrução Delete é executada usando um bloqueio de linha, cada linha da tabela é bloqueada para exclusão.
  • Podemos especificar filtros na cláusula where.
  • Exclui dados especificados se houver condição.
  • Exclua atividades um gatilho porque a operação é registrada individualmente.
  • Mais lento que truncado porque mantém registros

Truncar

  • Truncar é um comando DDL.
  • Truncar tabela sempre bloqueia a tabela e a página, mas não cada linha. Como remove todos os dados.
  • Não é possível usar a condição Where.
  • Remove todos os dados.
  • A tabela truncar não pode ativar um acionador porque a operação não registra exclusões de linhas individuais.
  • Desempenho mais rápido em termos de desempenho, porque não mantém nenhum registro.

Nota: Excluir e Truncar ambos podem ser revertidos quando usados ​​com Transação. Se a transação for concluída, os meios confirmados, não podemos reverter o comando Truncar, mas ainda podemos reverter o comando Excluir dos arquivos de log, pois delete write os registra no arquivo de log, caso seja necessário reverter futuramente a partir dos arquivos de log.

Se você tiver uma restrição de chave estrangeira referente à tabela que está tentando truncar, isso não funcionará mesmo que a tabela de referência não possua dados. Isso ocorre porque a verificação de chave estrangeira é feita com DDL em vez de DML. Isso pode ser resolvido desativando temporariamente as restrições de chave estrangeira na tabela.

Excluir tabela é uma operação registrada. Portanto, a exclusão de cada linha é registrada no log de transações, o que a torna lenta. A tabela truncar também exclui todas as linhas de uma tabela, mas não registra a exclusão de cada linha; em vez disso, registra a desalocação das páginas de dados da tabela, o que a torna mais rápida.

~ Se você acidentalmente removeu todos os dados da tabela usando Excluir / Truncar. Você pode reverter a transação confirmada. Restaure o último backup e execute o log de transações até o momento em que Excluir / Truncar está prestes a acontecer.

wpzone4u
fonte
1
Obrigado @Lucas: ele incluiu o conteúdo. Eu apenas o coloquei em uma citação para deixar claro que era de uma fonte diferente.
AstroCB
4

No SQL Server 2005, acredito que você pode reverter um truncado


fonte
4

EXCLUIR

O comando DELETE é usado para remover linhas de uma tabela. Uma cláusula WHERE pode ser usada para remover apenas algumas linhas. Se nenhuma condição WHERE for especificada, todas as linhas serão removidas. Depois de executar uma operação DELETE, você precisará COMITAR ou ROLLBACK a transação para tornar a alteração permanente ou desfazê-la. Observe que esta operação fará com que todos os gatilhos DELETE na tabela sejam acionados.

TRUNCAR

TRUNCATE remove todas as linhas de uma tabela. A operação não pode ser revertida e nenhum acionador será acionado. Como tal, TRUCATE é mais rápido e não usa tanto espaço para desfazer quanto um DELETE.

SOLTA

O comando DROP remove uma tabela do banco de dados. Todas as linhas, índices e privilégios das tabelas também serão removidos. Nenhum gatilho DML será acionado. A operação não pode ser revertida.


DROP e TRUNCATE são comandos DDL, enquanto DELETE é um comando DML. Portanto, as operações DELETE podem ser revertidas (desfeitas), enquanto as operações DROP e TRUNCATE não podem ser revertidas.

De: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands

MyUserQuestion
fonte
Isso adiciona algo às respostas atuais?
David Aldridge
3

TRUNCATE pode ser revertido se envolvido em uma transação.

Por favor, veja as duas referências abaixo e teste-se: -

http://blog.sqlauthority.com/2007/12/26/sql-server-truncate-cant-be-rolled-back-using-log-files-after-transaction-session-is-closed/

http://sqlblog.com/blogs/kalen_delaney/archive/2010/10/12/tsql-tuesday-11-rolling-back-truncate-table.aspx

O TRUNCATE vs. DELETE é uma das perguntas infames durante entrevistas em SQL. Apenas certifique-se de explicá-lo adequadamente ao entrevistador ou isso pode custar-lhe o trabalho. O problema é que muitos não estão cientes, portanto é mais provável que eles considerem a resposta errada se você disser que o YES Truncate pode ser revertido.

SQLnbe
fonte
2

Uma pequena correção na resposta original - exclusão também gera quantidades significativas de refazer (como desfazer é protegido por refazer). Isso pode ser visto na saída de rastreamento automático:

SQL> delete from t1;

10918 rows deleted.

Elapsed: 00:00:00.58

Execution Plan
----------------------------------------------------------
   0      DELETE STATEMENT Optimizer=FIRST_ROWS (Cost=43 Card=1)
   1    0   DELETE OF 'T1'
   2    1     TABLE ACCESS (FULL) OF 'T1' (TABLE) (Cost=43 Card=1)




Statistics
----------------------------------------------------------
         30  recursive calls
      12118  db block gets
        213  consistent gets
        142  physical reads
    3975328  redo size
        441  bytes sent via SQL*Net to client
        537  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          2  sorts (memory)
          0  sorts (disk)
      10918  rows processed
CaptainPicard
fonte
seu encadeamento antigo, mas de acordo com meu entendimento truncado, gera apenas uma boa quantidade de refazer logs, onde, como delete, gera desfazer e refazer ambos.
Saurabh Sinha
2

Aqui está a minha resposta detalhada em a diferença entre DELETE e TRUNCATE no SQL Server

Remover dados : primeiro, ambos podem ser usados ​​para remover as linhas da tabela.
Mas um DELETE pode ser usado para remover as linhas não apenas de uma tabela, mas também de uma VIEW ou o resultado de um OPENROWSET ou OPENQUERY sujeito aos recursos do provedor.

Cláusula FROM : com DELETE, você também pode excluir linhas de uma tabela / exibição / linhas_função_limitada com base nas linhas de outra tabela usando outra cláusula FROM. Nessa cláusula FROM, você também pode escrever condições JOIN normais. Na verdade, você pode criar uma instrução DELETE a partir de uma instrução SELECT que não contém nenhuma função agregada, substituindo SELECT por DELETE e removendo os nomes das colunas.
Com TRUNCATE você não pode fazer isso.

ONDE : UM TRUNCATE não pode ter WHERE Conditions, mas um DELETE pode. Isso significa que, com TRUNCATE, você não pode excluir uma linha ou grupo específico de linhas. TRUNCATE TABLE é semelhante à instrução DELETE sem a cláusula WHERE.

Desempenho : TRUNCATE TABLE é mais rápido e utiliza menos recursos do sistema e do log de transações. E um dos motivos são os bloqueios usados ​​pelas duas instruções. A instrução DELETE é executada usando um bloqueio de linha, cada linha da tabela é bloqueada para exclusão. TRUNCATE TABLE sempre bloqueia a tabela e a página, mas não cada linha.

Log de transações : a instrução DELETE remove as linhas uma por vez e faz entradas individuais no log de transações para cada linha.
TRUNCATE TABLE remove os dados desalocando as páginas de dados usadas para armazenar os dados da tabela e registra apenas as desalocações da página no log de transações.

Páginas : depois que uma instrução DELETE é executada, a tabela ainda pode conter páginas vazias. TRUNCATE remove os dados desalocando as páginas de dados usadas para armazenar os dados da tabela.

Trigger : TRUNCATE não ativa os gatilhos de exclusão na tabela. Portanto, você deve ter muito cuidado ao usar TRUNCATE. Nunca se deve usar um TRUNCATE se o gatilho de exclusão estiver definido na tabela para executar alguma ação de limpeza ou registro automático quando as linhas forem excluídas.

Coluna de identidade : com TRUNCATE, se a tabela contiver uma coluna de identidade, o contador dessa coluna será redefinido para o valor inicial definido para a coluna. Se nenhuma semente foi definida, o valor padrão 1 é usado. DELETE não redefine o contador de identidade. Portanto, se você deseja manter o contador de identidade, use DELETE.

Replicação : DELETE pode ser usado na tabela usada na replicação transacional ou replicação de mesclagem.
Embora TRUNCATE não possa ser usado nas tabelas envolvidas na replicação transacional ou replicação de mesclagem.

Reversão : a instrução DELETE pode ser revertida.
TRUNCATE também pode ser revertido, desde que esteja incluído em um bloco TRANSACTION e a sessão não esteja fechada. Depois que a sessão for encerrada, você não poderá reverter TRUNCATE.

Restrições : a instrução DELETE pode falhar se violar um gatilho ou tentar remover uma linha referenciada por dados em outra tabela com uma restrição FOREIGN KEY. Se o DELETE remover várias linhas e qualquer uma das linhas removidas violar um gatilho ou restrição, a instrução será cancelada, um erro será retornado e nenhuma linha será removida.
E se DELETE for usado no modo de exibição, esse modo de exibição deverá ser uma exibição atualizável. TRUNCATE não pode ser usado contra a tabela usada no modo de exibição indexado.
TRUNCATE não pode ser usado contra a tabela referenciada por uma restrição FOREIGN KEY, a menos que uma tabela que tenha uma chave estrangeira que faça referência a si mesma.

Mangal Pardeshi
fonte
Oi Mangal - obrigado pela resposta, principalmente por questões específicas do SQL * Server. Você acha que poderia integrar esses pontos com a resposta do Wiki da Comunidade que foi aceita?
David Aldridge
Sim, mas como e onde? Desculpe, eu sou novo aqui.
Mangal Pardeshi,
"Então, se você deseja manter o contador de identidade, use DELETE", você poderia usarDECLARE @ai as bigint SET @ai =IDENT_CURRENT('tablename') TRUNCATE TABLE tablename DBCC checkident('tablename', RESEED, @ai)
mpag 04/11/16
1

A maior diferença é que truncar não é uma operação registrada enquanto excluir é.

Simplesmente significa que, no caso de uma falha no banco de dados, você não pode recuperar os dados operados por truncado, mas com a exclusão, você pode.

Mais detalhes aqui

Aprendendo
fonte
1

Instrução DELETE: Este comando exclui apenas as linhas da tabela com base na condição fornecida na cláusula where ou exclui todas as linhas da tabela se nenhuma condição for especificada. Mas isso não libera o espaço que contém a tabela.

A sintaxe de uma instrução SQL DELETE é:

DELETE FROM nome_tabela [condição WHERE];

Instrução TRUNCATE: Este comando é usado para excluir todas as linhas da tabela e liberar o espaço que contém a tabela.

Bhushan Patil
fonte
1

EXCLUIR

DELETE is a DML command
DELETE you can rollback
Delete = Only Delete- so it can be rolled back
In DELETE you can write conditions using WHERE clause
Syntax  Delete from [Table] where [Condition]

TRUNCAR

TRUNCATE is a DDL command
You can't rollback in TRUNCATE, TRUNCATE removes the record permanently
Truncate = Delete+Commit -so we can't roll back
You can't use conditions(WHERE clause) in TRUNCATE
Syntax  Truncate table [Table]

Para mais detalhes visite

http://www.zilckh.com/what-is-the-difference-between-truncate-and-delete/

user27332
fonte
1

Uma outra diferença das duas operações é que, se a tabela contiver uma coluna de identidade, o contador dessa coluna será redefinido 1 (ou para o valor inicial definido para a coluna) em TRUNCATE. DELETE não tem esse efeito.

zona oeste
fonte
0

Em resumo, truncar não registra nada (portanto, é muito mais rápido, mas não pode ser desfeito) enquanto a exclusão é registrada (e pode fazer parte de uma transação maior, reverterá etc). Se você possui dados que não deseja em uma tabela em dev, normalmente é melhor truncar, pois você não corre o risco de preencher o log de transações

Oskar
fonte
0

Um grande motivo é útil, quando você precisa atualizar os dados em uma tabela de vários milhões de linhas, mas não deseja reconstruí-los. "Excluir *" levaria uma eternidade, enquanto o impacto no desempenho de Truncate seria insignificante.

Jordan Ogren
fonte
0

Não é possível fazer DDL em um dblink.


fonte
0

Gostaria de comentar no post de matthieu, mas ainda não tenho o representante ...

No MySQL, o contador de incremento automático é redefinido com truncado, mas não com exclusão.

nathan
fonte
0

Não é que o truncado não registre nada no SQL Server. truncate não registra nenhuma informação, mas registra a página de desalocação de dados da tabela na qual você acionou TRUNCATE.

e o registro truncado podem ser recuperados se definirmos a transação no início e podemos recuperar o registro truncado após a reversão. Mas não é possível recuperar registros truncados do backup do log de transações após a transação truncada confirmada.

user2587360
fonte
0

Truncar também pode ser revertido aqui o exapmle

begin Tran
delete from  Employee

select * from Employee
Rollback
select * from Employee
Vinay Pandit
fonte
0

Truncar e Excluir no SQL são dois comandos que são usados ​​para remover ou excluir dados da tabela. Embora de natureza bastante básica, os dois comandos SQL podem criar muitos problemas até que você esteja familiarizado com os detalhes antes de usá-lo. Uma escolha incorreta de comando pode resultar em um processo muito lento ou pode até explodir o segmento de log, se muitos dados precisarem ser removidos e o segmento de log não for suficiente. É por isso que é fundamental saber quando usar o comando truncar e excluir no SQL, mas antes de usá-los, você deve estar ciente das diferenças entre truncar e excluir e, com base nelas, poderemos descobrir quando DELETE é a melhor opção para remover data ou TRUNCATE devem ser usados ​​para limpar as tabelas.

Consulte cheque clique aqui

wpzone4u
fonte
0

Ao emitir uma instrução TRUNCATE TABLE, você está instruindo o SQL Server a excluir todos os registros de uma tabela, sem que nenhum processamento de log ou transação ocorra.

Gerald
fonte
0

A instrução DELETE pode ter uma cláusula WHERE para excluir registros específicos, enquanto a instrução TRUNCATE não requer nenhum e limpa a tabela inteira. Importante, a instrução DELETE registra a data excluída, enquanto a instrução TRUNCATE não.

Todos
fonte
0

Mais uma diferença específica para o servidor sql da microsoft é que deletevocê pode usar a outputinstrução para rastrear quais registros foram excluídos, por exemplo:

delete from [SomeTable]
output deleted.Id, deleted.Name

Você não pode fazer isso com truncate.

Mykhailo Seniutovych
fonte