Qual è la differenza tra TRUNCATE e DELETE in SQL


303

Qual è la differenza tra TRUNCATEe DELETEin SQL?

Se la tua risposta è specifica per la piattaforma, ti preghiamo di indicarlo.


4
Tutte le risposte sono specifiche della piattaforma. Non esiste un comando TRUNCATE in SQL standard. È quindi una funzione proprietaria e significa una cosa diversa per ogni fornitore DBMS.
nvogel,

La risposta è molto specifica per l'implementazione, come deve essere, poiché, come sottolineato da sqlvogel, si tratta di un comando non standard (TRUNCATE). O lascia questo 'oracolo' taggato o rendiamolo una risposta in stile wiki di comunità e
inseriamo

Se Transaction viene eseguita, significa COMMITED, quindi non è possibile eseguire il rollback del comando TRUNCATE, ma possiamo ancora eseguire il rollback del comando DELETE dai file LOG, poiché DELETE write li registra nel file Log nel caso in cui sia necessario eseguire il rollback in futuro dai file LOG.

Risposte:


272

Ecco un elenco di differenze. Ho messo in evidenza le funzionalità specifiche di Oracle e spero che la community possa aggiungere anche le differenze specifiche di altri fornitori. Le differenze comuni alla maggior parte dei fornitori possono andare direttamente sotto le intestazioni, con le differenze evidenziate di seguito.


Panoramica generale

Se vuoi eliminare rapidamente tutte le righe da una tabella e sei davvero sicuro di volerlo fare, e non hai chiavi esterne contro le tabelle, allora un TRUNCATE sarà probabilmente più veloce di un DELETE .

Devono essere considerati vari problemi specifici del sistema, come descritto di seguito.


Tipo di dichiarazione

Elimina è DML, Troncato è DDL ( Che cos'è DDL e DML? )


Commit e rollback

Variabile per fornitore

Server SQL

Troncare può essere ripristinato.

PostgreSQL

Troncare può essere ripristinato.

Oracolo

Poiché un TRUNCATE è DDL, comporta due commit, uno prima e uno dopo l'esecuzione dell'istruzione. Pertanto, il troncamento non può essere ripristinato e un errore nel processo di troncamento avrà comunque emesso un commit.

Tuttavia, vedi Flashback di seguito.


Bonifica dello spazio

Elimina non recupera spazio, Tronca ripristina spazio

Oracolo

Se si utilizza la clausola REUSE STORAGE, i segmenti di dati non vengono disallocati, il che può essere marginalmente più efficiente se la tabella deve essere ricaricata con i dati. Il segno dell'acqua alta viene ripristinato.


Ambito di riga

Elimina può essere utilizzato per rimuovere tutte le righe o solo un sottoinsieme di righe. Tronca rimuove tutte le righe.

Oracolo

Quando una tabella viene partizionata, le singole partizioni possono essere troncate in modo isolato, quindi è possibile una parziale rimozione di tutti i dati della tabella.


Tipi di oggetti

L'eliminazione può essere applicata a tabelle e tabelle all'interno di un cluster. Troncare si applica solo alle tabelle o all'intero cluster. (Può essere specifico per Oracle)


Identità oggetto dati

Oracolo

L'eliminazione non influisce sull'ID oggetto dati, ma il troncamento assegna un nuovo ID oggetto dati a meno che non ci sia mai stato un inserimento contro la tabella dalla sua creazione Anche un singolo inserto che viene eseguito il rollback farà sì che un nuovo ID oggetto dati venga assegnato al troncamento .


Flashback (Oracle)

Il flashback funziona attraverso le eliminazioni, ma un troncamento impedisce il flashback agli stati prima dell'operazione.

Tuttavia, da 11gR2 la funzione ARCHIVIO FLASHBACK lo consente, tranne che in Express Edition

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


privilegi

Variabile

Oracolo

L'eliminazione può essere concessa su una tabella a un altro utente o ruolo, ma il troncamento non può avvenire senza l'utilizzo di una concessione DROP ANY TABLE.


Redo / Undo

Elimina genera una piccola quantità di ripetizione e una grande quantità di annullamento. Troncare genera una quantità trascurabile di ciascuno.


indici

Oracolo

Un'operazione troncata rende nuovamente utilizzabili gli indici inutilizzabili. Elimina no.


Chiavi straniere

Non è possibile applicare un troncamento quando una chiave esterna abilitata fa riferimento alla tabella. Il trattamento con cancellazione dipende dalla configurazione delle chiavi esterne.


Blocco della tabella

Oracolo

Troncare richiede un blocco tabella esclusivo, l'eliminazione richiede un blocco tabella condiviso. Quindi disabilitare i blocchi di tabella è un modo per impedire le operazioni troncate su una tabella.


trigger

I trigger DML non si attivano su un troncato.

Oracolo

I trigger DDL sono disponibili.


Esecuzione remota

Oracolo

Il troncamento non può essere emesso tramite un collegamento al database.


Colonne di identità

Server SQL

Troncare reimposta la sequenza per i tipi di colonna IDENTITY, l'eliminazione no.


Set di risultati

Nella maggior parte delle implementazioni, DELETEun'istruzione può restituire al client le righe che sono state eliminate.

ad esempio in un sottoprogramma Oracle PL / SQL è possibile:

DELETE FROM employees_temp
WHERE       employee_id = 299 
RETURNING   first_name,
            last_name
INTO        emp_first_name,
            emp_last_name;

Non capisci la tua quarta affermazione: se dico DELETE [ ] FROM Table; quindi * tutte le righe in quella tabella saranno eliminate a meno che un FK non lo fermi. A proposito, suppongo che questo sia specifico di SQL Server, non è possibile utilizzare TRUNCATE su tabelle con FK.
Joe Pineda,

Qualche altro commento: non sono d'accordo con la tua terza affermazione, a meno che non sia specifico di Oracle. Almeno con SQL S. o se ELIMINA o TRUNCATE non ripristini lo spazio (cioè i file di database non si restringono sul disco rigido) a meno che non lo richieda specificamente.
Joe Pineda,

1
5a dichiarazione: è possibile eseguire il rollback di una TABELLA TRUNCATE su sql 2008 r2
Eric Labashosky,

1
Postgresql può eseguire il rollback di un TRUNCATE e quindi anche non lo inserisce automaticamente.
rfusca,

5
DELETE restituisce il numero di righe eliminate, ma TRUNCATE no. È un punto molto sciocco ma vale la pena menzionarlo :)
Deepak Kumar Jha

192

La differenza tra troncare ed eliminare è elencata di seguito:

+----------------------------------------+----------------------------------------------+
|                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)              |
+----------------------------------------+----------------------------------------------+

Troncare l'identità di reset della tabella Cosa significa? Ma, per quanto riguarda Elimina?
Ravi,

1
@jWeaver: significa che quando si imposta la proprietà Specifica identità su True per il campo chiave primaria, quindi quando si inseriscono dati in quella tabella, la colonna chiave primaria ha un valore come 1,2,3,4,5 .... (se Identity inizia da 1 e seed è 1), e quando si tronca la tabella perderà tutto il valore dell'identità, quindi quando si inizia a inserire nuovamente i dati in quella tabella, inizierà da 1 invece di dove è stato lasciato per ultimo. In DELETE, è inverso, conserva il valore dell'identità anche dopo aver eseguito l'istruzione DELETE. Ci scusiamo per il secondo errore del punto di confronto nella colonna ELIMINA nell'immagine sopra.
Bhaumik Patel,

Sembra che tu stia rispondendo a SQL SERVER
Ravi,

4
È possibile eseguire il rollback di TRUNCATE e DELETE in SQL SERVER . E nella seconda riga ELIMINA dose non resettare identità. Ora come puoi modificare questo post? Questa è la cosa brutta dell'uso delle immagini in StackOverflow.
Mahmood Jenami il

2
Il troncamento viene ripristinato! (SQL SERVER)
Aimal Khan

55

FAR CADERE

Il comando DROP rimuove una tabella dal database. Verranno inoltre rimosse tutte le righe, gli indici e i privilegi delle tabelle. Nessun trigger DML verrà attivato. L'operazione non può essere ripristinata.

TRONCARE

TRUNCATE rimuove tutte le righe da una tabella. Non è possibile eseguire il rollback dell'operazione e non verranno attivati ​​trigger. Pertanto, TRUNCATE è più veloce e non utilizza lo spazio di annullamento di un DELETE. Il blocco a livello di tabella verrà aggiunto durante il troncamento.

ELIMINA

Il comando DELETE viene utilizzato per rimuovere le righe da una tabella. Una clausola WHERE può essere utilizzata per rimuovere solo alcune righe. Se non viene specificata alcuna condizione WHERE, tutte le righe verranno rimosse. Dopo aver eseguito un'operazione DELETE è necessario COMMIT o ROLLBACK la transazione per rendere permanente la modifica o annullarla. Notare che questa operazione farà scattare tutti i trigger DELETE sul tavolo. Il blocco a livello di riga verrà aggiunto durante l'eliminazione.

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


5
Bella spiegazione per un principiante come me
Vikas Kukreti,

Breve e dolce
ABH,

23

Tutte le risposte valide, a cui devo aggiungere:

Poiché TRUNCATE TABLEè un comando DDL ( Data Defination Language ), non un comando DML ( Data Manipulation Langauge ), il comando Delete Triggersnon viene eseguito.


Ah, si innesca ... questo è un buon punto. Lo aggiungerò all'elenco che ho creato e ti accredito Polara, se va bene.
David Aldridge,

SQL Server non ti consente di troncare una tabella con chiavi esterne, quindi il punto a cascata potrebbe essere moot, a seconda della piattaforma.
Meff,

PostgreSQL ha un "trigger TRUNCATE"
a_horse_with_no_name


17

Con SQL Server o MySQL, se è presente un PK con incremento automatico, il troncamento ripristinerà il contatore.


Per chiarire, questo è per SQL Server se la tabella ha una colonna definita come IDENTITÀ. Elimina manterrebbe l'ultimo ID assegnato automaticamente, mentre Truncate ripristina il contatore.
Codewerks,

Poiché la domanda è etichettata ORACLE, questa risposta è ERRATA, quindi viene valutata in basso.
Guy

oops, non ho visto l'etichetta dell'oracolo :)
Mathieu,

+1 vero e lo reimposta su 0 . Se invece vuoi che sia 1 :DBCC CHECKIDENT (table_name, RESEED, 1)
JohnB

L'ho aggiunto alla risposta della community e l'ho reso un po 'più semplice per la documentazione di problemi specifici del fornitore
David Aldridge,

12

"Troncare non registra nulla" è corretto. Andrei oltre:

Troncare non viene eseguito nel contesto di una transazione.

Il vantaggio della velocità di troncamento rispetto all'eliminazione dovrebbe essere ovvio. Tale vantaggio varia da banale a enorme, a seconda della situazione.

Tuttavia, ho visto troncare rompere involontariamente l'integrità referenziale e violare altri vincoli. Il potere che ottieni modificando i dati al di fuori di una transazione deve essere bilanciato dalla responsabilità che erediti quando cammini sul filo del rasoio senza una rete.


7

TRUNCATEè l'istruzione DDL mentre DELETEè un'istruzione DML. Di seguito sono le differenze tra i due:

  1. Come un'istruzione TRUNCATEDDL ( Data definition language ) non richiede un commit per rendere permanenti le modifiche. E questo è il motivo per cui non è stato possibile eseguire il rollback delle righe eliminate da troncato. D'altra parte DELETEè un'istruzione DML ( Data manipulation language ) quindi richiede un commit esplicito per rendere permanente il suo effetto.

  2. TRUNCATErimuove sempre tutte le righe da una tabella, lasciando vuota la tabella e la struttura della tabella intatta, mentre DELETEpuò essere rimossa in modo condizionale se viene utilizzata la clausola where.

  3. Le righe eliminate TRUNCATE TABLEdall'istruzione non possono essere ripristinate e non è possibile specificare la clausola where nell'istruzione TRUNCATE.

  4. TRUNCATEdichiarazioni non si aziona trigger a differenza dei sui trigger di eliminazione sulla DELETEdichiarazione

Ecco l'ottimo link pertinente all'argomento.


6

Sì, DELETE è più lento, TRUNCATE è più veloce. Perché?

DELETE deve leggere i record, controllare i vincoli, aggiornare il blocco, aggiornare gli indici e generare ripetizione / annullamento. Tutto ciò richiede tempo.

TRUNCATE regola semplicemente un puntatore nel database per la tabella (High Water Mark) e poof! i dati sono spariti.

Questo è specifico per Oracle, AFAIK.


Anche PostgreSQL è simile a questo.
Gavin M. Roy,

6

TRONCARE

TRUNCATE La query SQL rimuove tutte le righe da una tabella, senza registrare le singole eliminazioni di riga.

  • TRUNCATE è un comando DDL.
  • TRUNCATE viene eseguito utilizzando un blocco tabella e l'intera tabella viene bloccata per rimuovere tutti i record.
  • Non possiamo usare la clausola WHERE con TRUNCATE.
  • TRUNCATE rimuove tutte le righe da una tabella.
  • Registrazione minima nel registro delle transazioni, quindi è più veloce in termini di prestazioni.
  • TRUNCATE TABLE rimuove i dati deallocando le pagine di dati utilizzate per archiviare i dati della tabella e registra solo le deallocazioni di pagine nel registro delle transazioni.
  • Per utilizzare Troncare su una tabella è necessaria almeno l'autorizzazione ALTER sulla tabella.
  • Troncare utilizza meno spazio di transazione rispetto all'istruzione Delete.
  • Il troncamento non può essere utilizzato con le viste indicizzate.
  • TRUNCATE è più veloce di DELETE.

ELIMINA

Per eseguire una coda DELETE, sono richieste autorizzazioni di eliminazione sulla tabella di destinazione. Se è necessario utilizzare una clausola WHERE in DELETE, è necessario selezionare anche le autorizzazioni.

  • DELETE è un comando DML.
  • DELETE viene eseguito utilizzando un blocco di riga, ogni riga nella tabella viene bloccata per l'eliminazione.
  • Possiamo usare la clausola where con DELETE per filtrare ed eliminare record specifici.
  • Il comando DELETE viene utilizzato per rimuovere le righe da una tabella in base alla condizione WHERE.
  • Mantiene il registro, quindi più lento di TRUNCATE.
  • L'istruzione DELETE rimuove le righe una alla volta e registra una voce nel registro delle transazioni per ciascuna riga eliminata.
  • L'identità della colonna keep DELETE mantiene l'identità.
  • Per utilizzare Elimina è necessaria l'autorizzazione ELIMINA sulla tabella.
  • Elimina utilizza più spazio di transazione dell'istruzione Troncare.
  • Elimina può essere utilizzato con viste indicizzate.

5

Se accidentalmente hai rimosso tutti i dati dalla tabella usando Elimina / Tronca. È possibile eseguire il rollback della transazione impegnata. Ripristinare l'ultimo backup ed eseguire il registro delle transazioni fino al momento in cui Elimina / Tronca sta per verificarsi.

Le informazioni correlate di seguito sono tratte da un post sul blog :

Mentre lavoriamo sul database, stiamo usando Elimina e tronca senza conoscere le differenze tra di loro. In questo articolo discuteremo la differenza tra Elimina e Tronca in SQL.

Elimina:

  • Elimina è un comando DML.
  • L'istruzione di eliminazione viene eseguita utilizzando un blocco di riga, ogni riga nella tabella viene bloccata per l'eliminazione.
  • Possiamo specificare i filtri nella clausola where.
  • Elimina i dati specificati se esiste la condizione.
  • Elimina attività un trigger perché l'operazione viene registrata singolarmente.
  • Più lento di Troncare perché mantiene i registri

Troncare

  • Troncare è un comando DDL.
  • Troncare tabella blocca sempre la tabella e la pagina ma non ogni riga, poiché rimuove tutti i dati.
  • Impossibile utilizzare la condizione Where.
  • Rimuove tutti i dati.
  • La tabella di troncamento non può attivare un trigger poiché l'operazione non registra le singole eliminazioni di riga.
  • Più veloce in termini di prestazioni, perché non mantiene alcun registro.

Nota: Elimina e Tronca entrambi possono essere ripristinati quando utilizzati con Transazione. Se Transaction viene eseguita, significa commit, quindi non è possibile eseguire il rollback del comando Truncate, ma possiamo comunque eseguire il rollback del comando Delete dai file di log, poiché delete write li registra nel file di log nel caso in cui sia necessario eseguire il rollback in futuro dai file di log.

Se hai un vincolo di chiave esterna che fa riferimento alla tabella che stai tentando di troncare, questo non funzionerà anche se la tabella di riferimento non contiene dati. Questo perché il controllo della chiave esterna viene eseguito con DDL anziché DML. Questo può essere aggirato disabilitando temporaneamente i vincoli di chiave esterna alla tabella.

Elimina tabella è un'operazione registrata. Quindi la cancellazione di ogni riga viene registrata nel registro delle transazioni, il che rende lento. Troncare tabella inoltre elimina tutte le righe in una tabella, ma non registra l'eliminazione di ogni riga, ma registra la deallocazione delle pagine di dati della tabella, che lo rende più veloce.

~ Se accidentalmente hai rimosso tutti i dati dalla tabella usando Elimina / Tronca. È possibile eseguire il rollback della transazione impegnata. Ripristinare l'ultimo backup ed eseguire il registro delle transazioni fino al momento in cui Elimina / Tronca sta per verificarsi.


1
Grazie a @Lucas: ha sottolineato il contenuto. L'ho appena inserito in una blockquote per far capire che proveniva da una fonte diversa.
AstroCB,

4

In SQL Server 2005 credo che sia possibile eseguire il rollback di un troncato


4

ELIMINA

Il comando DELETE viene utilizzato per rimuovere le righe da una tabella. Una clausola WHERE può essere utilizzata per rimuovere solo alcune righe. Se non viene specificata alcuna condizione WHERE, tutte le righe verranno rimosse. Dopo aver eseguito un'operazione DELETE è necessario COMMIT o ROLLBACK la transazione per rendere permanente la modifica o annullarla. Notare che questa operazione farà scattare tutti i trigger DELETE sul tavolo.

TRONCARE

TRUNCATE rimuove tutte le righe da una tabella. Non è possibile eseguire il rollback dell'operazione e non verranno attivati ​​trigger. Pertanto, TRUCATE è più veloce e non utilizza lo spazio di annullamento di un DELETE.

FAR CADERE

Il comando DROP rimuove una tabella dal database. Verranno inoltre rimosse tutte le righe, gli indici e i privilegi delle tabelle. Nessun trigger DML verrà attivato. L'operazione non può essere ripristinata.


DROP e TRUNCATE sono comandi DDL, mentre DELETE è un comando DML. Pertanto le operazioni DELETE possono essere ripristinate (annullate), mentre le operazioni DROP e TRUNCATE non possono essere ripristinate.

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


Questo aggiunge qualcosa alle risposte attuali?
David Aldridge,

3

TRUNCATE può essere ripristinato se inserito in una transazione.

Consulta i due riferimenti seguenti e mettiti alla prova: -

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

TRUNCATE vs. DELETE è una delle famigerate domande durante le interviste SQL. Assicurati solo di spiegarlo correttamente all'intervistatore o potrebbe costarti il ​​lavoro. Il problema è che non molti sono consapevoli, quindi molto probabilmente considereranno la risposta errata se si dice loro che SI Truncate può essere ripristinato.


2

Una piccola correzione alla risposta originale - delete genera anche quantità significative di ripetizione (poiché l'annullamento è esso stesso protetto da ripetizione). Questo può essere visto dall'output di autotrace:

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

il suo vecchio thread, ma secondo la mia comprensione, troncare genera solo una buona quantità di registro di ripetizione dove come eliminazione genera annulla e ripeti entrambi.
Saurabh Sinha,

2

Ecco la mia risposta dettagliata sulla differenza tra DELETE e TRUNCATE in SQL Server

Rimuovi dati : per prima cosa, entrambi possono essere utilizzati per rimuovere le righe dalla tabella.
Tuttavia, DELETE può essere utilizzato per rimuovere le righe non solo da una tabella ma anche da una VISTA o dal risultato di OPENROWSET o OPENQUERY in base alle funzionalità del provider.

Clausola FROM : con DELETE è anche possibile eliminare le righe da una tabella / view / rowset_function_limited in base alle righe di un'altra tabella utilizzando un'altra clausola FROM. In quella clausola FROM puoi anche scrivere le normali condizioni JOIN. In realtà è possibile creare un'istruzione DELETE da un'istruzione SELECT che non contiene alcuna funzione aggregata sostituendo SELECT con DELETE e rimuovendo i nomi di colonna.
Con TRUNCATE non puoi farlo.

DOVE : un TRUNCATE non può avere le condizioni DOVE, ma un ELIMINA può. Ciò significa che con TRUNCATE non è possibile eliminare una riga specifica o un gruppo specifico di righe. TRUNCATE TABLE è simile all'istruzione DELETE senza clausola WHERE.

Prestazioni : TRUNCATE TABLE è più veloce e utilizza meno risorse del registro di sistema e delle transazioni. E uno dei motivi sono i blocchi utilizzati da entrambe le istruzioni. L'istruzione DELETE viene eseguita utilizzando un blocco di riga, ogni riga nella tabella viene bloccata per l'eliminazione. TRUNCATE TABLE blocca sempre la tabella e la pagina ma non ogni riga.

Registro delle transazioni : l'istruzione DELETE rimuove le righe una alla volta e crea singole voci nel registro delle transazioni per ogni riga.
TRUNCATE TABLE rimuove i dati deallocando le pagine di dati utilizzate per archiviare i dati della tabella e registra solo le deallocazioni di pagine nel registro delle transazioni.

Pagine : dopo l'esecuzione di un'istruzione DELETE, la tabella può ancora contenere pagine vuote. TRUNCATE rimuove i dati deallocando le pagine di dati utilizzate per memorizzare i dati della tabella.

Trigger : TRUNCATE non attiva i trigger di eliminazione sulla tabella. Quindi devi stare molto attento durante l'utilizzo di TRUNCATE. Non si dovrebbe mai usare un TRUNCATE se il trigger di eliminazione è definito nella tabella per eseguire alcune operazioni di pulizia o registrazione automatiche quando le righe vengono eliminate.

Colonna identità : con TRUNCATE se la tabella contiene una colonna identità, il contatore per quella colonna viene reimpostato sul valore seed definito per la colonna. Se non è stato definito alcun seme, viene utilizzato il valore predefinito 1. DELETE non reimposta il contatore di identità. Quindi, se si desidera conservare il contatore di identità, utilizzare invece ELIMINA.

Replica : DELETE può essere utilizzato sulla tabella utilizzata nella replica transazionale o nella replica di tipo merge.
Mentre TRUNCATE non può essere utilizzato contro le tabelle coinvolte nella replica transazionale o nella replica di tipo merge.

Rollback : l'istruzione DELETE può essere ripristinata.
TRUNCATE può anche essere ripristinato a condizione che sia racchiuso in un blocco TRANSAZIONE e che la sessione non sia chiusa. Una volta chiusa la sessione non sarà possibile eseguire il rollback di TRUNCATE.

Restrizioni : l'istruzione DELETE potrebbe non riuscire se viola un trigger o tenta di rimuovere una riga a cui fanno riferimento i dati in un'altra tabella con un vincolo FOREIGN KEY. Se DELETE rimuove più righe e una delle righe rimosse viola un trigger o un vincolo, l'istruzione viene annullata, viene restituito un errore e nessuna riga viene rimossa.
E se DELETE viene utilizzato su Visualizza, tale vista deve essere una vista aggiornabile. TRUNCATE non può essere utilizzato contro la tabella utilizzata nella vista indicizzata.
TRUNCATE non può essere utilizzato contro la tabella a cui fa riferimento un vincolo FOREIGN KEY, a meno che una tabella che abbia una chiave esterna che faccia riferimento a se stessa.


Ciao Mangal - grazie per la risposta, in particolare per i problemi specifici di SQL * Server. Pensi di poter integrare questi punti con la risposta Wiki della community che è stata accettata?
David Aldridge,

Sì certo, ma come e dove? Scusa, sono nuovo qui.
Mangal Pardeshi,

"Quindi, se vuoi conservare il contatore di identità, usa CANC" potresti usareDECLARE @ai as bigint SET @ai =IDENT_CURRENT('tablename') TRUNCATE TABLE tablename DBCC checkident('tablename', RESEED, @ai)
mpag

1

La differenza più grande è che il troncamento è un'operazione non registrata mentre l'eliminazione è.

Significa semplicemente che in caso di arresto anomalo del database, non è possibile ripristinare i dati gestiti da troncato ma con l'eliminazione è possibile.

Maggiori dettagli qui


1

Istruzione DELETE: questo comando elimina solo le righe dalla tabella in base alla condizione indicata nella clausola where o elimina tutte le righe dalla tabella se non viene specificata alcuna condizione. Ma non libera lo spazio contenente la tabella.

La sintassi di un'istruzione DELETE SQL è:

DELETE FROM table_name [condizione WHERE];

Istruzione TRUNCATE: questo comando viene utilizzato per eliminare tutte le righe dalla tabella e liberare lo spazio contenente la tabella.


1

ELIMINA

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]

TRONCARE

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]

Per maggiori dettagli visita

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


1

Un'ulteriore differenza delle due operazioni è che se la tabella contiene una colonna identità, il contatore per quella colonna viene resettato 1 (o al valore seed definito per la colonna) in TRUNCATE. DELETE non ha questo effetto.


0

In breve, troncare non registra nulla (quindi è molto più veloce ma non può essere annullato) mentre l'eliminazione è registrata (e può far parte di una transazione più grande, eseguirà il rollback ecc.). Se hai dati che non vuoi in una tabella in dev è normalmente meglio troncare poiché non corri il rischio di riempire il registro delle transazioni


0

Un grande motivo per cui è utile è quando è necessario aggiornare i dati in una tabella con più milioni di righe, ma non si desidera ricostruirla. "Elimina *" richiederebbe un'eternità, mentre l'impatto sulle prestazioni di Truncate sarebbe trascurabile.


0

Impossibile eseguire DDL su un doppio lampeggio.


0

Commenterei il post di matthieu, ma non ho ancora il rappresentante ...

In MySQL, il contatore di incremento automatico viene ripristinato con troncato, ma non con eliminazione.


0

Non è che tronca non registra nulla in SQL Server. truncate non registra alcuna informazione ma registra la deallocazione della pagina di dati per la tabella su cui è stato attivato TRUNCATE.

e il record troncato può essere il rollback se definiamo la transazione all'inizio e possiamo ripristinare il record troncato dopo il rollback. Ma non è possibile recuperare i record troncati dal backup del registro delle transazioni dopo la transazione troncata impegnata.


0

Truncate può anche essere eseguito il rollback qui dell'esapmle

begin Tran
delete from  Employee

select * from Employee
Rollback
select * from Employee

0

Troncare ed eliminare in SQL sono due comandi utilizzati per rimuovere o eliminare i dati dalla tabella. Sebbene di natura abbastanza basilare, entrambi i comandi Sql possono creare molti problemi finché non si ha familiarità con i dettagli prima di usarli. Una scelta errata del comando può comportare un processo molto lento o addirittura l'espansione del segmento di registro, se è necessario rimuovere troppi dati e il segmento di registro non è sufficiente. Ecco perché è fondamentale sapere quando utilizzare il comando truncate ed delete in SQL, ma prima di utilizzarli dovresti essere consapevole delle differenze tra Truncate ed Delete e, in base a esse, dovremmo essere in grado di scoprire quando DELETE è l'opzione migliore per rimuovere dati o TRUNCATE devono essere usati per eliminare le tabelle.

Fare riferimento al controllo fare clic qui


0

Emettendo un'istruzione TRUNCATE TABLE, si indica a SQL Server di eliminare tutti i record all'interno di una tabella, senza che si verifichi alcuna registrazione o elaborazione delle transazioni.


0

L'istruzione DELETE può avere una clausola WHERE per eliminare record specifici mentre l'istruzione TRUNCATE non ne richiede alcuna e cancella l'intera tabella. È importante sottolineare che l'istruzione DELETE registra la data eliminata mentre non l'istruzione TRUNCATE.


0

Un'altra differenza specifica per Microsoft SQL Server è che deleteè possibile utilizzare l' outputistruzione per tenere traccia di quali record sono stati eliminati, ad esempio:

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

Non puoi farlo con truncate.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.