What's the difference between TRUNCATE and DELETE in SQL
Asked Answered
S

33

390

What's the difference between TRUNCATE and DELETE in SQL?

If your answer is platform specific, please indicate that.

Sihun answered 26/9, 2008 at 13:53 Comment(3)
All the answers are platform-specific. There is no TRUNCATE command in standard SQL. It is therefore a proprietary feature and means a different thing to each DBMS vendor.Dorty
The answer is very implementation specific, as it must be, since as sqlvogel pointed out, this is a non-standard command (TRUNCATE). Either leave this tagged 'oracle' or let's make it a community-wiki style answer, and put in the consequences for each major RDBMS (Oracle, MS-MSQL, PostgreSQL all implement TRUNCATE...)Kokoschka
If Transaction is done, means COMMITED, then we can not rollback TRUNCATE command, but we can still rollback DELETE command from LOG files, as DELETE write records them in Log file in case it is needed to rollback in future from LOG files.Rudie
S
314

Here's a list of differences. I've highlighted Oracle-specific features, and hopefully the community can add in other vendors' specific difference also. Differences that are common to most vendors can go directly below the headings, with differences highlighted below.


General Overview

If you want to quickly delete all of the rows from a table, and you're really sure that you want to do it, and you do not have foreign keys against the tables, then a TRUNCATE is probably going to be faster than a DELETE.

Various system-specific issues have to be considered, as detailed below.


Statement type

Delete is DML, Truncate is DDL (What is DDL and DML?)


Commit and Rollback

Variable by vendor

SQL*Server

Truncate can be rolled back.

PostgreSQL

Truncate can be rolled back.

Oracle

Because a TRUNCATE is DDL it involves two commits, one before and one after the statement execution. Truncate can therefore not be rolled back, and a failure in the truncate process will have issued a commit anyway.

However, see Flashback below.


Space reclamation

Delete does not recover space, Truncate recovers space

Oracle

If you use the REUSE STORAGE clause then the data segments are not de-allocated, which can be marginally more efficient if the table is to be reloaded with data. The high water mark is reset.


Row scope

Delete can be used to remove all rows or only a subset of rows. Truncate removes all rows.

Oracle

When a table is partitioned, the individual partitions can be truncated in isolation, thus a partial removal of all the table's data is possible.


Object types

Delete can be applied to tables and tables inside a cluster. Truncate applies only to tables or the entire cluster. (May be Oracle specific)


Data Object Identity

Oracle

Delete does not affect the data object id, but truncate assigns a new data object id unless there has never been an insert against the table since its creation Even a single insert that is rolled back will cause a new data object id to be assigned upon truncation.


Flashback (Oracle)

Flashback works across deletes, but a truncate prevents flashback to states prior to the operation.

However, from 11gR2 the FLASHBACK ARCHIVE feature allows this, except in Express Edition

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


Privileges

Variable

Oracle

Delete can be granted on a table to another user or role, but truncate cannot be without using a DROP ANY TABLE grant.


Redo/Undo

Delete generates a small amount of redo and a large amount of undo. Truncate generates a negligible amount of each.


Indexes

Oracle

A truncate operation renders unusable indexes usable again. Delete does not.


Foreign Keys

A truncate cannot be applied when an enabled foreign key references the table. Treatment with delete depends on the configuration of the foreign keys.


Table Locking

Oracle

Truncate requires an exclusive table lock, delete requires a shared table lock. Hence disabling table locks is a way of preventing truncate operations on a table.


Triggers

DML triggers do not fire on a truncate.

Oracle

DDL triggers are available.


Remote Execution

Oracle

Truncate cannot be issued over a database link.


Identity Columns

SQL*Server

Truncate resets the sequence for IDENTITY column types, delete does not.


Result set

In most implementations, a DELETE statement can return to the client the rows that were deleted.

e.g. in an Oracle PL/SQL subprogram you could:

DELETE FROM employees_temp
WHERE       employee_id = 299 
RETURNING   first_name,
            last_name
INTO        emp_first_name,
            emp_last_name;
Sihun answered 26/9, 2008 at 13:53 Comment(11)
Don't understand your 4th statement: if I say DELETE [] FROM Table; then *all rows in that table will be deleted unless a FK stops it. By the way, I guess this is SQL Server-specific, you can't use TRUNCATE on tables with FKs.Earthly
Some more comments: I disagree with your 3rd statement, unless it's Oracle-specific. At least with SQL S. either if you DELETE or TRUNCATE you don't recover space (i.e. database files don't shrink on the hard drive) unless you specifically ask for it.Earthly
4th statement: Sure, but the DELETE command doesn't have to delete all rows because you can apply a predicate to it, whereas the truncate does unless you are truncating a (sub)partition. Obvious, but trueSihun
3rd statement. Maybe there's an implementation difference here. In Oracle, neither command shrinks the data files, but the truncate will shrink the data (and associated index) segments within the data files and thus increase data file free space. Is that consistent with SQL Server?Sihun
5TH Statement: you can rollback a TRUNCATE TABLE on sql 2008 r2Mythomania
Postgresql can rollback a TRUNCATE and thus also does not autocommit it.Conveyor
Truncate deallocates data pages. Delete does not (on Sql server). That I think is what was meant by storage recovery (after a shrink). REF: en.wikipedia.org/wiki/Truncate_(SQL)Nunciature
DELETE returns number of rows deleted, but TRUNCATE does not. It is very silly point but worth mentioning it :)Neckline
Postgres does allow you to do BEFORE/AFTER TRUNCATE ON foo FOR EACH STATEMENT EXECUTE PROCEDURE bar(), but that's totally independent of any DELETE triggers.Mooney
TRUNCATE reset auto_increment, DELETE doesn'tRaji
For some, permissions would be a factor also, in MS SQL you need ALTER TABLE permission as a minimum to run TRUNCATE TABLE. Most users shouldn't need this level normally, however it does depend on circumstances.. Mentioned more here: dba.stackexchange.com/questions/52828/…Closure
R
231

The difference between truncate and delete is listed below:

+----------------------------------------+----------------------------------------------+
|                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)              |
+----------------------------------------+----------------------------------------------+
Ridglee answered 15/10, 2012 at 17:7 Comment(5)
Truncate reset identity of table What does it mean ? But, What about Delete ?Regenerator
@jWeaver: It means when you set Identity Specification property to True for Primary key field, so when you insert data into that table, primary key column holds value like 1,2,3,4,5....(if Identity starts from 1 and seed is 1), and when you truncate table it will lost all identity value, so when you start inserting data into that table again it will starts from 1 instead of where it is left last. In DELETE, it's reverse, it preserves identity value even after you execute DELETE statement. Sorry for 2nd comparison point mistake in DELETE column in above image.Ridglee
Seems like you are answering for SQL SERVERRegenerator
Both TRUNCATE and DELETE can be rolledBack in SQL SERVER. And in the 2nd row DELETE dose not reset identity. Now how can you edit this post? That's the bad thing about using pictures in StackOverflow.Turley
Truncate is being rolled back! (SQL SERVER)Caritacaritas
W
71

DROP

The DROP command removes a table from the database. All the tables' rows, indexes and privileges will also be removed. No DML triggers will be fired. The operation cannot be rolled back.

TRUNCATE

TRUNCATE removes all rows from a table. The operation cannot be rolled back and no triggers will be fired. As such, TRUNCATE is faster and doesn't use as much undo space as a DELETE. Table level lock will be added when Truncating.

DELETE

The DELETE command is used to remove rows from a table. A WHERE clause can be used to only remove some rows. If no WHERE condition is specified, all rows will be removed. After performing a DELETE operation you need to COMMIT or ROLLBACK the transaction to make the change permanent or to undo it. Note that this operation will cause all DELETE triggers on the table to fire. Row level lock will be added when deleting.

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

Wandie answered 15/4, 2015 at 8:2 Comment(0)
D
25

All good answers, to which I must add:

Since TRUNCATE TABLE is a DDL (Data Defination Language), not a DML (Data Manipulation Langauge) command, the Delete Triggers do not run.

Debbidebbie answered 26/9, 2008 at 14:28 Comment(3)
Ah, triggers ... that's a good point. I'll add that to the list I made and credit you Polara, if that's OK.Sihun
SQL Server will not let you truncate a table with foreign keys, so your cascading point could be moot, depending on platform.Doited
PostgreSQL has a "TRUNCATE Trigger"Itinerate
N
25

Summary of Delete Vs Truncate in SQL server

enter image description here

Taken from CodAffection article : Delete Vs Truncate in SQL Server

Norwegian answered 14/5, 2016 at 16:7 Comment(0)
K
20

With SQL Server or MySQL, if there is a PK with auto increment, truncate will reset the counter.

Karankaras answered 26/9, 2008 at 13:56 Comment(5)
To clarify, this is for SQL Server if the table has a column defined as IDENTITY. Delete would maintain the last auto-assigned ID, while Truncate resets the counter.Aston
As the question is tagged ORACLE, then this answer is WRONG, therefore downvoted.Involute
oops, didn't see the oracle tag :)Karankaras
+1 true, and it resets it to 0. If you want it to be 1 instead: DBCC CHECKIDENT (table_name, RESEED, 1)Schramke
I've added this into the community answer, and made it a bit more friendly for documenting vendor-specific issuesSihun
C
12

"Truncate doesn't log anything" is correct. I'd go further:

Truncate is not executed in the context of a transaction.

The speed advantage of truncate over delete should be obvious. That advantage ranges from trivial to enormous, depending on your situation.

However, I've seen truncate unintentionally break referential integrity, and violate other constraints. The power that you gain by modifying data outside a transaction has to be balanced against the responsibility that you inherit when you walk the tightrope without a net.

Cargile answered 26/9, 2008 at 14:12 Comment(0)
K
11

TRUNCATE is the DDL statement whereas DELETE is a DML statement. Below are the differences between the two:

  1. As TRUNCATE is a DDL (Data definition language) statement it does not require a commit to make the changes permanent. And this is the reason why rows deleted by truncate could not be rollbacked. On the other hand DELETE is a DML (Data manipulation language) statement hence requires explicit commit to make its effect permanent.

  2. TRUNCATE always removes all the rows from a table, leaving the table empty and the table structure intact whereas DELETE may remove conditionally if the where clause is used.

  3. The rows deleted by TRUNCATE TABLE statement cannot be restored and you can not specify the where clause in the TRUNCATE statement.

  4. TRUNCATE statements does not fire triggers as opposed of on delete trigger on DELETE statement

Here is the very good link relevant to the topic.

Kalinda answered 9/12, 2009 at 11:31 Comment(0)
L
8

Yes, DELETE is slower, TRUNCATE is faster. Why?

DELETE must read the records, check constraints, update the block, update indexes, and generate redo/undo. All of that takes time.

TRUNCATE simply adjusts a pointer in the database for the table (the High Water Mark) and poof! the data is gone.

This is Oracle specific, AFAIK.

Ludendorff answered 27/9, 2008 at 13:46 Comment(1)
PostgreSQL is similar to this as well.Specht
D
7

Here is my detailed answer on the difference between DELETE and TRUNCATE in SQL Server

Remove Data : First thing first, both can be used to remove the rows from table.
But a DELETE can be used to remove the rows not only from a Table but also from a VIEW or the result of an OPENROWSET or OPENQUERY subject to provider capabilities.

FROM Clause : With DELETE you can also delete rows from one table/view/rowset_function_limited based on rows from another table by using another FROM clause. In that FROM clause you can also write normal JOIN conditions. Actually you can create a DELETE statement from a SELECT statement that doesn’t contain any aggregate functions by replacing SELECT with DELETE and removing column names.
With TRUNCATE you can’t do that.

WHERE : A TRUNCATE cannot have WHERE Conditions, but a DELETE can. That means with TRUNCATE you can’t delete a specific row or specific group of rows. TRUNCATE TABLE is similar to the DELETE statement with no WHERE clause.

Performance : TRUNCATE TABLE is faster and uses fewer system and transaction log resources. And one of the reason is locks used by either statements. The DELETE statement is executed using a row lock, each row in the table is locked for deletion. TRUNCATE TABLE always locks the table and page but not each row.

Transaction log : DELETE statement removes rows one at a time and makes individual entries in the transaction log for each row.
TRUNCATE TABLE removes the data by deallocating the data pages used to store the table data and records only the page deallocations in the transaction log.

Pages : After a DELETE statement is executed, the table can still contain empty pages. TRUNCATE removes the data by deallocating the data pages used to store the table data.

Trigger : TRUNCATE does not activate the delete triggers on the table. So you must be very careful while using TRUNCATE. One should never use a TRUNCATE if delete Trigger is defined on the table to do some automatic cleanup or logging action when rows are deleted.

Identity Column : With TRUNCATE if the table contains an identity column, the counter for that column is reset to the seed value defined for the column. If no seed was defined, the default value 1 is used. DELETE doesn’t reset the identity counter. So if you want to retain the identity counter, use DELETE instead.

Replication : DELETE can be used against table used in transactional replication or merge replication.
While TRUNCATE cannot be used against the tables involved in transactional replication or merge replication.

Rollback : DELETE statement can be rolled back.
TRUNCATE can also be rolled back provided it is enclosed in a TRANSACTION block and session is not closed. Once session is closed you won't be able to Rollback TRUNCATE.

Restrictions : The DELETE statement may fail if it violates a trigger or tries to remove a row referenced by data in another table with a FOREIGN KEY constraint. If the DELETE removes multiple rows, and any one of the removed rows violates a trigger or constraint, the statement is canceled, an error is returned, and no rows are removed.
And if DELETE is used against View, that View must be an Updatable view. TRUNCATE cannot be used against the table used in Indexed view.
TRUNCATE cannot be used against the table referenced by a FOREIGN KEY constraint, unless a table that has a foreign key that references itself.

Deadpan answered 5/11, 2015 at 9:49 Comment(3)
Hi Mangal -- thanks for the answer, particularly for SQL*Server specific issues. Do you think you could integrate those points in with the Community Wiki answer that was accepted?Sihun
Yes sure, but how and where? Sorry I'm new here.Deadpan
"So if you want to retain the identity counter, use DELETE" could you use DECLARE @ai as bigint SET @ai =IDENT_CURRENT('tablename') TRUNCATE TABLE tablename DBCC checkident('tablename', RESEED, @ai)Libertinism
D
6

If accidentally you removed all the data from table using Delete/Truncate. You can rollback committed transaction. Restore the last backup and run transaction log till the time when Delete/Truncate is about to happen.

The related information below is from a blog post:

While working on database, we are using Delete and Truncate without knowing the differences between them. In this article we will discuss the difference between Delete and Truncate in Sql.

Delete:

  • Delete is a DML command.
  • Delete statement is executed using a row lock,each row in the table is locked for deletion.
  • We can specify filters in where clause.
  • It deletes specified data if where condition exists.
  • Delete activities a trigger because the operation are logged individually.
  • Slower than Truncate because it Keeps logs

Truncate

  • Truncate is a DDL command.
  • Truncate table always lock the table and page but not each row.As it removes all the data.
  • Cannot use Where condition.
  • It Removes all the data.
  • Truncate table cannot activate a trigger because the operation does not log individual row deletions.
  • Faster in performance wise, because it doesn't keep any logs.

Note: Delete and Truncate both can be rolled back when used with Transaction. If Transaction is done, means committed then we can not rollback Truncate command, but we can still rollback Delete command from Log files, as delete write records them in Log file in case it is needed to rollback in future from log files.

If you have a Foreign key constraint referring to the table you are trying to truncate, this won't work even if the referring table has no data in it. This is because the foreign key checking is done with DDL rather than DML. This can be got around by temporarily disabling the foreign key constraint(s) to the table.

Delete table is a logged operation. So the deletion of each row gets logged in the transaction log, which makes it slow. Truncate table also deletes all the rows in a table, but it won't log the deletion of each row instead it logs the deallocation of the data pages of the table, which makes it faster.

~ If accidentally you removed all the data from table using Delete/Truncate. You can rollback committed transaction. Restore the last backup and run transaction log till the time when Delete/Truncate is about to happen.

Dysphasia answered 20/8, 2014 at 17:32 Comment(1)
Thank @Lucas: he inlined the content. I just put it in a blockquote to make it apparent that it was from a difference source.Respond
D
4

In SQL Server 2005 I believe that you can rollback a truncate

Dibru answered 27/3, 2009 at 12:26 Comment(0)
P
4

DELETE

The DELETE command is used to remove rows from a table. A WHERE clause can be used to only remove some rows. If no WHERE condition is specified, all rows will be removed. After performing a DELETE operation you need to COMMIT or ROLLBACK the transaction to make the change permanent or to undo it. Note that this operation will cause all DELETE triggers on the table to fire.

TRUNCATE

TRUNCATE removes all rows from a table. The operation cannot be rolled back and no triggers will be fired. As such, TRUCATE is faster and doesn't use as much undo space as a DELETE.

DROP

The DROP command removes a table from the database. All the tables' rows, indexes and privileges will also be removed. No DML triggers will be fired. The operation cannot be rolled back.


DROP and TRUNCATE are DDL commands, whereas DELETE is a DML command. Therefore DELETE operations can be rolled back (undone), while DROP and TRUNCATE operations cannot be rolled back.

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

Positivism answered 7/4, 2015 at 9:33 Comment(1)
Does this add something to the current answers?Sihun
T
3

TRUNCATE can be rolled back if wrapped in a transaction.

Please see the two references below and test yourself:-

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

The TRUNCATE vs. DELETE is one of the infamous questions during SQL interviews. Just make sure you explain it properly to the Interviewer or it might cost you the job. The problem is that not many are aware so most likely they will consider the answer as wrong if you tell them that YES Truncate can be rolled back.

Twopence answered 21/8, 2014 at 14:55 Comment(0)
G
3

One further difference of the two operations is that if the table contains an identity column, the counter for that column is reset 1 (or to the seed value defined for the column) under TRUNCATE. DELETE does not have this affect.

Genista answered 6/10, 2014 at 9:44 Comment(0)
I
2

A small correction to the original answer - delete also generates significant amounts of redo (as undo is itself protected by redo). This can be seen from autotrace output:

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
Indispensable answered 27/9, 2008 at 15:26 Comment(1)
its old thread but as per my understanding truncate only generate good amount of redo log where as delete generates undo and redo both.Christan
E
2

DELETE

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]

TRUNCATE

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]

For more details visit

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

Eadie answered 7/9, 2013 at 12:18 Comment(0)
N
1

The biggest difference is that truncate is non logged operation while delete is.

Simply it means that in case of a database crash , you cannot recover the data operated upon by truncate but with delete you can.

More details here

Nuts answered 26/9, 2008 at 13:56 Comment(0)
S
1

DELETE Statement: This command deletes only the rows from the table based on the condition given in the where clause or deletes all the rows from the table if no condition is specified. But it does not free the space containing the table.

The Syntax of a SQL DELETE statement is:

DELETE FROM table_name [WHERE condition];

TRUNCATE statement: This command is used to delete all the rows from the table and free the space containing the table.

Sodomy answered 26/6, 2013 at 22:15 Comment(0)
C
1

Here is a summary of some important differences between these sql commands:

sql truncate command:

1) It is a DDL (Data Definition Language) command, therefore commands such as COMMIT and ROLLBACK do not apply to this command (the exceptions here are PostgreSQL and MSSQL, whose implementation of the TRUNCATE command allows the command to be used in a transaction)

2) You cannot undo the operation of deleting records, it occurs automatically and is irreversible (except for the above exceptions - provided, however, that the operation is included in the TRANSACTION block and the session is not closed). In case of Oracle - Includes two implicit commits, one before and one after the statement is executed. Therefore, the command cannot be withdrawn while a runtime error will result in commit anyway

3) Deletes all records from the table, records cannot be limited to deletion. For Oracle, when the table is split per partition, individual partitions can be truncated (TRUNCATE) in isolation, making it possible to partially remove all data from the table

4) Frees up the space occupied by the data in the table (in the TABLESPACE - on disk). For Oracle - if you use the REUSE STORAGE clause, the data segments will not be rolled back, i.e. you will keep space from the deleted rows allocated to the table, which can be a bit more efficient if the table is to be reloaded with data. The high mark will be reset

5) TRUNCATE works much faster than DELETE

6) Oracle Flashback in the case of TRUNCATE prevents going back to pre-operative states

7) Oracle - TRUNCATE cannot be granted (GRANT) without using DROP ANY TABLE

8) The TRUNCATE operation makes unusable indexes usable again

9) TRUNCATE cannot be used when the enabled foreign key refers to another table, then you can:

  • execute the command: DROP CONSTRAINT, then TRUNCATE, and then play it through CREATE CONSTRAINT or
  • execute the command: SET FOREIGN_KEY_CHECKS = 0; then TRUNCATE, then: SET_FOREIGN_KEY_CHECKS = 1;

10) TRUNCATE requires an exclusive table lock, therefore, turning off exclusive table lock is a way to prevent TRUNCATE operation on the table

11) DML triggers do not fire after executing TRUNCATE (so be very careful in this case, you should not use TRUNCATE, if a delete trigger is defined in the table to perform an automatic table cleanup or a logon action after row deletion). On Oracle, DDL triggers are fired

12) Oracle - TRUNCATE cannot be used in the case of: database link 13) TRUNCATE does not return the number of records deleted

14) Transaction log - one log indicating page deallocation (removes data, releasing allocation of data pages used for storing table data and writes only page deallocations to the transaction log) - faster execution than DELETE. TRUNCATE only needs to adjust the pointer in the database to the table (High Water Mark) and the data is immediately deleted, therefore it uses less system resources and transaction logs

15) Performance (acquired lock) - table and page lock - does not degrade performance during execution

16) TRUNCATE cannot be used on tables involved in transactional replication or merge replication

sql delete command:

1) It is a DML (Data Manipulation Language) command, therefore the following commands are used for this command: COMMIT and ROLLBACK

2) You can undo the operation of removing records by using the ROLLBACK command

3) Deletes all or some records from the table, you can limit the records to be deleted by using the WHERE clause

4) Does not free the space occupied by the data in the table (in the TABLESPACE - on the disk)

5) DELETE works much slower than TRUNCATE

6) Oracle Flashback works for DELETE

7) Oracle - For DELETE, you can use the GRANT command

8) The DELETE operation does not make unusable indexes usable again

9) DELETE in case foreign key enabled refers to another table, can (or not) be applied depending on foreign key configuration (if not), please:

  • execute the command: DROP CONSTRAINT, then TRUNCATE, and then play it through CREATE CONSTRAINT or
  • execute the command: SET FOREIGN_KEY_CHECKS = 0; then TRUNCATE, then: SET_FOREIGN_KEY_CHECKS = 1;

10) DELETE requires a shared table lock

11) Triggers fire

12) DELETE can be used in the case of: database link

13) DELETE returns the number of records deleted

14) Transaction log - for each deleted record (deletes rows one at a time and records an entry in the transaction log for each deleted row) - slower execution than TRUNCATE. The table may still contain blank pages after executing the DELETE statement. DELETE needs to read records, check constraints, update block, update indexes, and generate redo / undo. All of this takes time, hence it takes time much longer than with TRUNCATE

15) Performance (acquired lock) - record lock - reduces performance during execution - each record in the table is locked for deletion

16) DELETE can be used on a table used in transactional replication or merge replication

Chapin answered 18/8, 2022 at 15:33 Comment(0)
R
0

In short, truncate doesn't log anything (so is much faster but can't be undone) whereas delete is logged (and can be part of a larger transaction, will rollback etc). If you have data that you don't want in a table in dev it is normally better to truncate as you don't run the risk of filling up the transaction log

Rwanda answered 26/9, 2008 at 13:56 Comment(0)
S
0

A big reason it is handy, is when you need to refresh the data in a multi-million row table, but don't want to rebuild it. "Delete *" would take forever, whereas the perfomance impact of Truncate would be negligible.

Spicebush answered 26/9, 2008 at 14:17 Comment(0)
S
0

Can't do DDL over a dblink.

Spindlelegs answered 26/9, 2008 at 23:44 Comment(0)
A
0

I'd comment on matthieu's post, but I don't have the rep yet...

In MySQL, the auto increment counter gets reset with truncate, but not with delete.

Aquarist answered 27/9, 2008 at 1:8 Comment(0)
R
0

It is not that truncate does not log anything in SQL Server. truncate does not log any information but it log the deallocation of data page for the table on which you fired TRUNCATE.

and truncated record can be rollback if we define transaction at beginning and we can recover the truncated record after rollback it. But can not recover truncated records from the transaction log backup after committed truncated transaction.

Rey answered 25/1, 2014 at 7:19 Comment(0)
L
0

Truncate can also be Rollbacked here the exapmle

begin Tran
delete from  Employee

select * from Employee
Rollback
select * from Employee
Loaves answered 30/7, 2014 at 8:32 Comment(0)
D
0

Truncate and Delete in SQL are two commands which is used to remove or delete data from table. Though quite basic in nature both Sql commands can create lot of trouble until you are familiar with details before using it. An Incorrect choice of command can result is either very slow process or can even blew up log segment, if too much data needs to be removed and log segment is not enough. That's why it's critical to know when to use truncate and delete command in SQL but before using these you should be aware of the Differences between Truncate and Delete, and based upon them, we should be able to find out when DELETE is better option for removing data or TRUNCATE should be used to purge tables.

Refer check click here

Dysphasia answered 22/8, 2014 at 18:20 Comment(0)
C
0

By issuing a TRUNCATE TABLE statement, you are instructing SQL Server to delete every record within a table, without any logging or transaction processing taking place.

Creech answered 6/10, 2014 at 0:25 Comment(0)
P
0

DELETE statement can have a WHERE clause to delete specific records whereas TRUNCATE statement does not require any and wipes the entire table. Importantly, the DELETE statement logs the deleted date whereas the TRUNCATE statement does not.

Peti answered 13/6, 2016 at 4:18 Comment(0)
T
0

One more difference specific to microsoft sql server is with delete you can use output statement to track what records have been deleted, e.g.:

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

You cannot do this with truncate.

Triennium answered 19/4, 2017 at 6:58 Comment(0)
D
0

Truncate command is used to re-initialize the table, it is a DDL command which delete all the rows of table.Whereas DELETE is a DML command which is used to delete row or set of rows according to some condition, if condition is not specified then this command will delete all the rows from the table.

Damle answered 26/4, 2017 at 7:51 Comment(0)
C
-1

The main difference why truncate is so faster that delete for bigger tables or how truncate actually works is that it drops the table and then recreates the structure only. For more details watch the video: https://www.youtube.com/watch?v=T4QjkZ58K7c

Cheap answered 7/2, 2024 at 13:12 Comment(2)
any affiliation with the channel of the linked video?Ferri
Not true in Oracle, or any other database I know of.Sihun
H
-5

TRUNCATE is fast, DELETE is slow.

Although, TRUNCATE has no accountability.

Hostetter answered 27/9, 2008 at 1:17 Comment(0)

© 2022 - 2025 — McMap. All rights reserved.