В чем разница между TRUNCATE и DELETE в SQL - PullRequest
238 голосов
/ 26 сентября 2008

В чем разница между TRUNCATE и DELETE в SQL?

Если ваш ответ зависит от платформы, укажите это.

Ответы [ 31 ]

4 голосов
/ 27 марта 2009

В SQL Server 2005 я считаю, что вы можете откатить усечение

3 голосов
/ 21 августа 2014

TRUNCATE можно откатить, если включить транзакцию.

Пожалуйста, посмотрите две ссылки ниже и проверьте себя: -

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 - один из печально известных вопросов во время интервью SQL. Просто убедитесь, что вы правильно объясните это интервьюеру, иначе это может стоить вам работы. Проблема в том, что не многие знают, поэтому, скорее всего, они сочтут ответ неправильным, если вы скажете им, что ДА усечение можно откатить.

3 голосов
/ 07 апреля 2015

DELETE

Команда DELETE используется для удаления строк из таблицы. Предложение WHERE может использоваться только для удаления некоторых строк. Если условие WHERE не указано, все строки будут удалены. После выполнения операции DELETE вам нужно выполнить COMMIT или ROLLBACK транзакцию, чтобы сделать изменение постоянным или отменить его. Обратите внимание, что эта операция вызовет срабатывание всех триггеров DELETE в таблице.

TRUNCATE

TRUNCATE удаляет все строки из таблицы. Операция не может быть отменена, и никакие триггеры не будут запущены. Таким образом, TRUCATE работает быстрее и не использует столько места для отмены, сколько DELETE.

DROP

Команда DROP удаляет таблицу из базы данных. Все строки таблиц, индексы и привилегии также будут удалены. Никакие триггеры DML не сработают. Операция не может быть отменена.


DROP и TRUNCATE являются командами DDL, тогда как DELETE является командой DML. Поэтому операции DELETE можно откатить (отменить), а операции DROP и TRUNCATE нельзя откатить.

От: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands

2 голосов
/ 05 ноября 2015

Вот мой подробный ответ о разнице между DELETE и TRUNCATE в SQL Server

Удалить данные : Во-первых, оба могут использоваться для удаления строк из таблицы.
Но DELETE можно использовать для удаления строк не только из таблицы, но также из VIEW или результата OPENROWSET или OPENQUERY в зависимости от возможностей провайдера.

FROM Clause : С помощью DELETE вы также можете удалять строки из одной таблицы / view / rowset_function_limited на основе строк из другой таблицы, используя другое предложение FROM. В этом предложении FROM вы также можете написать нормальные условия JOIN. На самом деле вы можете создать инструкцию DELETE из инструкции SELECT, которая не содержит каких-либо агрегатных функций, заменив SELECT на DELETE и удалив имена столбцов.
С TRUNCATE вы не можете этого сделать.

WHERE : У TRUNCATE не может быть условий WHERE, но может быть DELETE. Это означает, что с TRUNCATE вы не можете удалить конкретную строку или определенную группу строк. TRUNCATE TABLE похож на оператор DELETE без предложения WHERE.

Производительность : TRUNCATE TABLE работает быстрее и использует меньше ресурсов системы и журнала транзакций. И одна из причин - блокировки, используемые обоими утверждениями. Оператор DELETE выполняется с использованием блокировки строк, каждая строка в таблице заблокирована для удаления. TRUNCATE TABLE всегда блокирует таблицу и страницу, но не каждую строку.

Журнал транзакций : оператор DELETE удаляет строки по одной за раз и делает отдельные записи в журнале транзакций для каждой строки.
TRUNCATE TABLE удаляет данные, освобождая страницы данных, используемые для хранения данных таблицы, и записывает только освобождения страниц в журнал транзакций.

Pages : после выполнения оператора DELETE таблица все еще может содержать пустые страницы. TRUNCATE удаляет данные, освобождая страницы данных, используемые для хранения данных таблицы.

Триггер : TRUNCATE не активирует триггеры удаления в таблице. Поэтому вы должны быть очень осторожны при использовании TRUNCATE. Никогда не следует использовать TRUNCATE, если в таблице определен триггер удаления, чтобы выполнить автоматическую очистку или запись в журнал действий при удалении строк.

Столбец идентификаторов : С TRUNCATE, если таблица содержит столбец идентификаторов, счетчик для этого столбца сбрасывается на начальное значение, определенное для столбца. Если начальное число не было определено, используется значение по умолчанию 1. УДАЛЕНИЕ не сбрасывает счетчик идентификаторов. Поэтому, если вы хотите сохранить счетчик идентификаторов, используйте вместо этого DELETE.

Репликация : DELETE можно использовать для таблицы, используемой в репликации транзакций или репликации слиянием.
Хотя TRUNCATE нельзя использовать для таблиц, участвующих в репликации транзакций или репликации слиянием.

Откат : оператор DELETE можно откатить.
TRUNCATE также можно откатить, если он заключен в блок TRANSACTION и сеанс не закрыт. После закрытия сессии вы не сможете откатить TRUNCATE.

Ограничения : оператор DELETE может завершиться ошибкой, если он нарушает триггер или пытается удалить строку, на которую ссылаются данные в другой таблице, с ограничением FOREIGN KEY. Если команда DELETE удаляет несколько строк, и любая из удаленных строк нарушает триггер или ограничение, оператор отменяется, возвращается ошибка и строки не удаляются.
И если DELETE используется против View, этот View должен быть представлением с возможностью обновления. TRUNCATE нельзя использовать для таблицы, используемой в индексированном представлении.
TRUNCATE нельзя использовать для таблицы, на которую ссылается ограничение FOREIGN KEY, если только таблица не имеет внешнего ключа, который ссылается на себя.

2 голосов
/ 27 сентября 2008

Небольшая поправка к исходному ответу - удаление также приводит к значительному количеству повторов (так как отмена сама защищена повторением). Это видно по выводу автотрассировки:

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
1 голос
/ 07 сентября 2013

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]

Для более подробной информации посетите

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

1 голос
/ 26 сентября 2008

Самое большое отличие состоит в том, что усечение не является зарегистрированной операцией, а удаление -.

Просто это означает, что в случае сбоя базы данных вы не можете восстановить данные, обработанные усечением, но с помощью удаления вы можете.

Подробнее здесь

1 голос
/ 27 июня 2013

Оператор DELETE: эта команда удаляет только строки из таблицы на основе условия, указанного в предложении where, или удаляет все строки из таблицы, если условие не указано. Но это не освобождает пространство, содержащее таблицу.

Синтаксис оператора SQL DELETE:

DELETE FROM table_name [ГДЕ условие];

Оператор TRUNCATE: эта команда используется для удаления всех строк из таблицы и освобождения пространства, содержащего таблицу.

1 голос
/ 06 октября 2014

Еще одно отличие этих двух операций состоит в том, что если таблица содержит столбец идентификаторов, счетчик для этого столбца сбрасывается на 1 (или на начальное значение, определенное для столбца) в поле TRUNCATE. УДАЛЕНИЕ не имеет этого влияния.

0 голосов
/ 26 апреля 2017

Усечение команда используется для повторной инициализации таблицы, это команда DDL, которая удаляет все строки таблицы. Где DELETE - это команда DML, которая используется для удаления строка или набор строк в соответствии с некоторым условием, если условие не указано, то эта команда удалит все строки из таблицы.

...