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

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

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

Все ответы зависят от платформы. В стандартном SQL нет команды TRUNCATE. Следовательно, это проприетарная функция, которая означает разные вещи для каждого поставщика СУБД.

nvogel 08.07.2011 16:54

Ответ очень зависит от реализации, как и должно быть, поскольку, как указал sqlvogel, это нестандартная команда (TRUNCATE). Либо оставьте этот тег с тегом «oracle», либо сделайте его ответом в стиле вики-сообщества и укажите последствия для каждой основной СУБД (Oracle, MS-MSQL, PostgreSQL все реализуют TRUNCATE ...)

reedstrm 15.10.2012 21:11

Если транзакция выполнена, означает COMMITED, тогда мы не можем откатить команду TRUNCATE, но мы все равно можем откатить команду DELETE из файлов LOG, поскольку запись DELETE записывает их в файл журнала на случай, если в будущем потребуется откат из файлов журнала.

user4768611 05.06.2015 10:57
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
332
3
518 977
32
Перейти к ответу Данный вопрос помечен как решенный

Ответы 32

Ответ принят как подходящий

Вот список отличий. Я выделил специфические особенности Oracle, и, надеюсь, сообщество также может добавить особые отличия от других поставщиков. Различия, которые являются общими для большинства поставщиков, могут быть указаны непосредственно под заголовками, а различия выделены ниже.


Общий обзор

Если вы хотите быстро удалить все строки из таблицы, и вы действительно уверены, что хотите это сделать, и у вас нет внешних ключей для таблиц, то TRUNCATE, вероятно, будет быстрее, чем DELETE. .

Необходимо учитывать различные специфические для системы проблемы, как подробно описано ниже.


Тип заявления

Delete - это DML, Truncate - это DDL (Что такое DDL и DML?)


Фиксация и откат

Переменная по поставщику

SQL * сервер

Truncate можно откатить.

PostgreSQL

Truncate можно откатить.

Oracle

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

Однако см. Flashback ниже.


Освоение космоса

Удаление не восстанавливает пространство, Truncate восстанавливает пространство

Oracle

Если вы используете предложение REUSE STORAGE, то сегменты данных не освобождаются, что может быть несколько более эффективным, если таблица должна быть перезагружена данными. Отметка максимального уровня сбрасывается.


Область действия строки

Удалить можно использовать для удаления всех строк или только подмножества строк. Усечение удаляет все строки.

Oracle

Когда таблица разбита на разделы, отдельные разделы могут быть усечены изолированно, поэтому возможно частичное удаление всех данных таблицы.


Типы объектов

Удалить можно применить к таблицам и таблицам внутри кластера. Усечение применяется только к таблицам или ко всему кластеру. (Может быть специфичным для Oracle)


Идентификация объекта данных

Oracle

Удаление не влияет на идентификатор объекта данных, но truncate назначает новый идентификатор объекта данных пока не, с момента его создания никогда не было вставки в таблицу. Даже одна вставка, которая откатывается, приведет к назначению нового идентификатора объекта данных при усечении. .


Воспоминания (Оракул)

Воспроизведение в обратном порядке работает при удалении, но усечение предотвращает возврат к состояниям до операции.

Однако, начиная с версии 11gR2, функция FLASHBACK ARCHIVE позволяет это, за исключением Express Edition.

Использование FLASHBACK в Oraclehttp://docs.oracle.com/cd/E11882_01/appdev.112/e41502/adfns_flashback.htm#ADFNS638


Привилегии

Переменная

Oracle

Удаление может быть предоставлено для таблицы другому пользователю или роли, но усечение невозможно без использования разрешения DROP ANY TABLE.


Вернуть / Отменить

При удалении выполняется небольшое количество повторов и большое количество отмен. Truncate генерирует незначительное количество каждого из них.


Индексы

Oracle

Операция усечения делает неиспользуемые индексы снова пригодными для использования. Удалять не получается.


Внешние ключи

Усечение не может применяться, когда активированный внешний ключ ссылается на таблицу. Обработка с удалением зависит от конфигурации внешних ключей.


Блокировка стола

Oracle

Для усечения требуется монопольная блокировка таблицы, для удаления - общая блокировка таблицы. Следовательно, отключение блокировок таблицы - это способ предотвратить операции усечения в таблице.


Триггеры

Триггеры DML не срабатывают при усечении.

Oracle

Доступны триггеры DDL.


Удаленное выполнение

Oracle

Усечение нельзя выполнить по ссылке на базу данных.


Столбцы идентичности

SQL * сервер

Truncate сбрасывает последовательность для типов столбцов IDENTITY, а удаление - нет.


Набор результатов

В большинстве реализаций оператор DELETE может возвращать клиенту удаленные строки.

например в подпрограмме Oracle PL / SQL вы можете:

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

Не понимаю вашего 4-го утверждения: если я скажу DELETE [] ИЗ таблицы; тогда * все, строки в этой таблице будут удалены, если только FK не остановит это. Кстати, я предполагаю, что это специфично для SQL Server, вы не можете использовать TRUNCATE для таблиц с FK.

Joe Pineda 27.03.2009 16:32

Еще несколько комментариев: я не согласен с вашим третьим утверждением, если оно не относится к Oracle. По крайней мере, с SQL S. Если вы DELETE или TRUNCATE, вы не восстанавливаете пространство (т.е. файлы базы данных не сжимаются на жестком диске), если вы специально не просите об этом.

Joe Pineda 27.03.2009 16:34

4-й оператор: Конечно, но команда DELETE не должна удалять все строки, потому что вы можете применить к ней предикат, тогда как усечение делает это, если вы не усекаете (под) раздел. Очевидно, но это правда

David Aldridge 27.03.2009 17:34

3-е заявление. Возможно, здесь есть разница в реализации. В Oracle ни одна из команд не сжимает файлы данных, но усечение сокращает сегменты данных (и связанный индекс) в файлах данных и, таким образом, увеличивает свободное пространство файла данных. Это согласуется с SQL Server?

David Aldridge 27.03.2009 17:36

5-е заявление: вы можете откатить таблицу TRUNCATE на sql 2008 r2

Eric Labashosky 30.07.2010 17:05

Postgresql может откатить TRUNCATE и, следовательно, не выполняет его автоматически.

rfusca 28.09.2011 19:23

Усечение освобождает страницы данных. Удалить нет (на сервере Sql). Думаю, именно это и имелось в виду под восстановлением хранилища (после сжатия). REF: en.wikipedia.org/wiki/Truncate_(SQL)

BaconSah 27.06.2013 02:38

DELETE возвращает количество удаленных строк, а TRUNCATE - нет. Это очень глупый момент, но о нем стоит упомянуть :)

Deepak Kumar Jha 12.01.2015 17:08

Postgres действительно позволяет использовать BEFORE/AFTER TRUNCATE ON foo FOR EACH STATEMENT EXECUTE PROCEDURE bar(), но это полностью не зависит от каких-либо триггеров DELETE.

Kevin 12.02.2015 08:10

TRUNCATE сбрасывает auto_increment, DELETE - нет

ekans 23.06.2015 12:39

Для некоторых также важны разрешения, в MS SQL вам нужно как минимум разрешение ALTER TABLE для запуска TRUNCATE TABLE. Большинству пользователей этот уровень обычно не нужен, однако это зависит от обстоятельств. Подробнее здесь: dba.stackexchange.com/questions/52828/…

CooPzZ 12.03.2020 03:10

В SQL Server или MySQL, если есть PK с автоматическим приращением, усечение сбросит счетчик.

Чтобы уточнить, это для SQL Server, если в таблице есть столбец, определенный как IDENTITY. Delete сохранит последний автоматически назначенный ID, а Truncate сбрасывает счетчик.

Codewerks 27.09.2008 18:10

Поскольку вопрос помечен тегом ORACLE, то это НЕПРАВИЛЬНЫЙ ответ, поэтому он отклонен.

Guy 29.09.2008 15:53

упс, не видел тега оракула :)

mathieu 29.09.2008 19:00

+1 истина, и он сбрасывает его на 0. Если вы хотите, чтобы вместо этого был 1: DBCC CHECKIDENT (table_name, RESEED, 1)

JohnB 06.08.2010 20:57

Я добавил это в ответ сообщества и сделал его более удобным для документирования проблем, связанных с конкретными поставщиками.

David Aldridge 23.06.2015 12:16

Короче говоря, truncate ничего не регистрирует (поэтому работает намного быстрее, но не может быть отменен), тогда как удаление регистрируется (и может быть частью более крупной транзакции, откатывается и т. д.). Если у вас есть данные, которые вам не нужны в таблице в dev, обычно лучше усечь, так как вы не рискуете заполнить журнал транзакций.

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

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

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

"Truncate ничего не регистрирует" является правильным. Я бы пошел дальше:

Усечение не выполняется в контексте транзакции.

Преимущество усечения перед удалением в скорости должно быть очевидным. Это преимущество варьируется от незначительного до огромного, в зависимости от вашей ситуации.

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

Большая причина, по которой это удобно, - это когда вам нужно обновить данные в таблице с многомиллионными строками, но вы не хотите ее перестраивать. «Удалить *» займет вечность, тогда как влияние Truncate на производительность будет незначительным.

Все хорошие ответы, к которым я должен добавить:

Поскольку TRUNCATE TABLE является командой DDL (Язык определения данных), а не DML (Язык обработки данных), Delete Triggers не запускается.

А, триггеры ... это хороший аргумент. Я добавлю это в список, который я составил, и отдаю должное вам Polara, если это нормально.

David Aldridge 26.09.2008 18:30

SQL Server не позволит вам усечение таблицы с внешними ключами, так что ваша точка каскадных может быть спорным, в зависимости от платформы.

Meff 27.09.2008 00:22

PostgreSQL имеет «триггер TRUNCATE»

a_horse_with_no_name 01.02.2012 15:04

Невозможно выполнить DDL через dblink.

Я бы прокомментировал пост Матье, но у меня еще нет репутации ...

В MySQL счетчик автоматического увеличения сбрасывается с помощью усечения, но не с помощью удаления.

TRUNCATE работает быстро, DELETE - медленно.

Хотя TRUNCATE не несет ответственности.

Да, DELETE медленнее, TRUNCATE быстрее. Почему?

DELETE должен читать записи, проверять ограничения, обновлять блок, обновлять индексы и генерировать повтор / отмену. Все это требует времени.

TRUNCATE просто настраивает указатель в базе данных для таблицы (High Water Mark) и пуф! данные пропали.

Это специфично для Oracle, AFAIK.

PostgreSQL также похож на это.

Gavin M. Roy 27.09.2008 18:00

Небольшая поправка к исходному ответу - удаление также генерирует значительное количество повторов (поскольку отмена сама защищена повторами). Это можно увидеть из вывода 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

его старый поток, но, как я понимаю, truncate генерирует только хорошее количество журнала повторов, тогда как удаление генерирует отмену и повтор обоих.

Saurabh Sinha 03.08.2016 14:35

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

TRUNCATE - это оператор DDL, тогда как DELETE - это оператор DML. Ниже приведены различия между ними:

  1. Поскольку TRUNCATE является оператором DDL (Язык определения данных), он не требует фиксации, чтобы сделать изменения постоянными. И это причина того, что строки, удаленные с помощью truncate, нельзя было откатить. С другой стороны, DELETE является оператором DML (Язык манипулирования данными), следовательно, требует явной фиксации, чтобы сделать его эффект постоянным.

  2. TRUNCATE всегда удаляет все строки из таблицы, оставляя таблицу пустой и структуру таблицы нетронутой, тогда как DELETE может удалить условно, если используется предложение where.

  3. Строки, удаленные оператором TRUNCATE TABLE, не могут быть восстановлены, и вы не можете указать предложение where в операторе TRUNCATE.

  4. Операторы TRUNCATE не запускают триггеры, в отличие от триггера удаления в операторе DELETE

Здесь - очень хорошая ссылка по теме.

Разница между усечением и удалением указана ниже:

+----------------------------------------+----------------------------------------------+
|                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)              |
+----------------------------------------+----------------------------------------------+
Усечь сбросить идентификатор таблицы What does it mean ? But, А как насчет удаления?
Ravi 11.07.2015 11:29

@jWeaver: это означает, что когда вы устанавливаете для свойства Identity Specification значение True для поля первичного ключа, поэтому, когда вы вставляете данные в эту таблицу, столбец первичного ключа содержит значение, подобное 1,2,3,4,5 .... (если Identity запускается from 1, а seed - 1), и когда вы усекаете таблицу, она теряет все значения идентификатора, поэтому, когда вы снова начнете вставлять данные в эту таблицу, они начнутся с 1, а не с того места, где они остались последними. В DELETE все наоборот, оно сохраняет значение идентификатора даже после выполнения оператора DELETE. Приносим извинения за ошибку второй точки сравнения в столбце УДАЛИТЬ на изображении выше.

Bhaumik Patel 14.07.2015 02:42

Похоже, вы отвечаете на SQL СЕРВЕР

Ravi 14.07.2015 06:05

И TRUNCATE, и DELETE можно откатить в SQL СЕРВЕР. И во 2-й строке УДАЛИТЬ дозу не сбрасывать личность. Как теперь отредактировать этот пост? Это плохая вещь в использовании изображений в StackOverflow.

Mahmood Jenami 03.08.2016 11:05

Откат Truncate! (SQL СЕРВЕР)

Aimal Khan 25.08.2018 01:33

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

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

УДАЛИТЬ ИЗ имя_таблицы [условие ГДЕ];

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

УДАЛИТЬ

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/

Дело не в том, что truncate ничего не регистрирует в SQL Server. truncate не регистрирует никакой информации, но регистрирует страницу освобождения данных для таблицы, для которой вы запустили TRUNCATE.

а усеченную запись можно откатить, если мы определим транзакцию в начале и сможем восстановить усеченную запись после ее отката. Но не может восстановить усеченные записи из резервной копии журнала транзакций после зафиксированной усеченной транзакции.

Truncate также можно откатить здесь на примере

begin Tran
delete from  Employee

select * from Employee
Rollback
select * from Employee

Если вы случайно удалили все данные из таблицы с помощью Delete / Truncate. Вы можете откатить совершенную транзакцию. Восстановите последнюю резервную копию и запустите журнал транзакций до того момента, когда вот-вот произойдет удаление / усечение.

Соответствующая информация ниже взята из сообщение в блоге:

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.

Спасибо @Lucas: он встроил контент. Я просто поместил это в цитату, чтобы было ясно, что это было из другого источника.

AstroCB 22.08.2014 00:36

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

Truncate и Delete в SQL - это две команды, которые используются для удаления или удаления данных из таблицы. Хотя обе команды Sql довольно просты по своей природе, они могут создать много проблем, пока вы не ознакомитесь с деталями перед их использованием. Неправильный выбор команды может привести либо к очень медленному процессу, либо к взорванию сегмента журнала, если необходимо удалить слишком много данных, а сегмента журнала недостаточно. Вот почему так важно знать, когда использовать команду усечения и удаления в SQL, но перед их использованием вы должны знать о различиях между усечением и удалением, и на их основе мы сможем узнать, когда DELETE является лучшим вариантом для удаления. data или TRUNCATE следует использовать для очистки таблиц.

См. Чек кликните сюда

Выполняя инструкцию TRUNCATE TABLE, вы инструктируете SQL Server удалить каждую запись в таблице без ведения журнала или обработки транзакций.

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

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.

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

Добавляет ли это что-то к текущим ответам?

David Aldridge 07.04.2015 14:06

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.

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

Хорошее объяснение для новичка вроде меня

Vikas Kukreti 03.05.2015 20:25

Коротко и мило

ABH 13.09.2019 14:52

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

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

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

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

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

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

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

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

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

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

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

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

Привет, Мангал - спасибо за ответ, особенно по вопросам, связанным с SQL * Server. Как вы думаете, можно ли интегрировать эти моменты в ответ сообщества Wiki, который был принят?

David Aldridge 05.11.2015 15:48

Да, конечно, но как и где? Извините, я здесь новенький.

Mangal Pardeshi 06.11.2015 06:40

«Итак, если вы хотите сохранить счетчик идентификаторов, используйте DELETE», не могли бы вы использовать DECLARE @ai as bigintSET @ai =IDENT_CURRENT('tablename')TRUNCATE TABLE tablenameDBCC checkident('tablename', RESEED, @ai)

mpag 05.11.2016 02:43

Сводная информация об удалении и усечении на сервере SQL
Для полной статьи перейдите по этой ссылке: http://codaffection.com/sql-server-article/delete-vs-truncate-in-sql-server/

Взято из статьи dotnet mob: Удалить Vs Truncate в SQL Server

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

Еще одно отличие, характерное для Microsoft sql server, заключается в том, что с delete вы можете использовать оператор output для отслеживания того, какие записи были удалены, например:

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

Вы не можете этого сделать с truncate.

Команда Усечь используется для повторной инициализации таблицы, это команда DDL, которая удаляет все строки таблицы, в то время как УДАЛИТЬ - команда DML, которая используется для удаления строки или набора строк в соответствии с некоторым условием, если условие не указано тогда эта команда удалит все строки из таблицы.

TRUNCATE

Запрос TRUNCATE SQL удаляет все строки из таблицы без регистрации удаления отдельных строк.

  • TRUNCATE - это команда DDL.
  • TRUNCATE выполняется с использованием блокировки таблицы, и вся таблица блокируется на удалить все записи.
  • Мы не можем использовать предложение WHERE с TRUNCATE.
  • TRUNCATE удаляет все строки из таблицы.
  • Минимальная регистрация в журнале транзакций, что обеспечивает более высокую производительность.
  • TRUNCATE TABLE удаляет данные, освобождая используемые страницы данных для хранения данных таблицы и записи только освобожденных страниц в журнал транзакций.
  • Чтобы использовать Truncate для таблицы, вам нужно как минимум разрешение ALTER на стол.
  • Truncate использует меньше места для транзакции, чем оператор Delete.
  • Усечение нельзя использовать с индексированными представлениями.
  • TRUNCATE быстрее, чем DELETE.

УДАЛИТЬ

Для выполнения очереди DELETE требуются разрешения на удаление в целевой таблице. Если вам нужно использовать предложение WHERE в DELETE, также требуются разрешения select.

  • DELETE - это команда DML.
  • DELETE выполняется с использованием блокировки строки, каждая строка в таблице заблокирована для удаления.
  • Мы можем использовать предложение where с DELETE для фильтрации и удаления определенных записи.
  • Команда DELETE используется для удаления строк из таблицы на основе WHERE условие.
  • Он ведет журнал, поэтому работает медленнее, чем TRUNCATE.
  • Оператор DELETE удаляет строки по одной и записывает запись. в журнале транзакций для каждой удаленной строки.
  • Идентификатор столбца сохраняет идентификатор. DELETE сохраняет идентификатор.
  • Чтобы использовать Delete, вам необходимо разрешение DELETE для таблицы.
  • Delete использует больше места для транзакции, чем инструкция Truncate.
  • Удалить можно использовать с индексированными представлениями.

Другие вопросы по теме