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

303

Какая разница между TRUNCATEи DELETEв SQL?

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

Дэвид Олдридж
источник
4
Все ответы зависят от платформы. В стандартном SQL нет команды TRUNCATE. Поэтому это проприетарная функция и означает разные вещи для каждого поставщика СУБД.
nvogel
Ответ очень специфичен для конкретной реализации, поскольку, как указывал sqlvogel, это нестандартная команда (TRUNCATE). Либо оставьте этот помеченный «оракул», либо давайте сделаем его ответом в стиле сообщества вики, и включим последствия для каждой основной СУБД (Oracle, MS-MSQL, PostgreSQL все реализуют TRUNCATE ...)
reedstrm
Если Transaction завершен, означает COMMITED, то мы не можем откатить команду TRUNCATE, но мы все равно можем откатить команду DELETE из файлов LOG, поскольку запись DELETE записывает их в файл журнала в случае необходимости отката в будущем из файлов LOG.

Ответы:

272

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


Общий обзор

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

Различные системные проблемы должны быть рассмотрены, как подробно описано ниже.


Тип выписки

Удалить - это DML, Truncate - это DDL ( Что такое DDL и DML? )


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

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

SQL * Сервер

Усечение можно откатить.

PostgreSQL

Усечение можно откатить.

оракул

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

Тем не менее, см. Воспоминание ниже.


Космическая мелиорация

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

оракул

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


Объем строки

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

оракул

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


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

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


Идентичность объекта данных

оракул

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


Воспоминание (Oracle)

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

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

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


привилегии

переменная

оракул

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


Redo / Undo

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


Индексы

оракул

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


Иностранные ключи

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


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

оракул

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


Триггеры

Триггеры DML не запускаются в усеченном состоянии.

оракул

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


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

оракул

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


Идентификационные столбцы

SQL * Сервер

Функция усечения сбрасывает последовательность для типов столбцов 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;
Дэвид Олдридж
источник
Не понимаю вашего четвертого утверждения: если я скажу DELETE [ ] FROM Table; тогда * все строки в этой таблице будут удалены, если FK не остановит это. Кстати, я думаю, это зависит от SQL Server, вы не можете использовать TRUNCATE для таблиц с FK.
Джо Пинеда
Еще несколько комментариев: я не согласен с вашим третьим утверждением, если оно не относится к Oracle. По крайней мере, с SQL S. Если вы удаляете DELETE или TRUNCATE, вы не восстанавливаете пространство (то есть файлы базы данных не сжимаются на жестком диске), если вы специально не попросите об этом.
Джо Пинеда
1
Пятое утверждение: вы можете откатить TRUNCATE TABLE на sql 2008 r2
Эрик Лабашоски
1
Postgresql может откатить TRUNCATE и, таким образом, также не будет автоматически фиксировать его.
rfusca
5
DELETE возвращает количество удаленных строк, а TRUNCATE - нет. Это очень глупый вопрос, но стоит упомянуть об этом :)
Дипак Кумар Джа
192

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

+----------------------------------------+----------------------------------------------+
|                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)              |
+----------------------------------------+----------------------------------------------+
Бхаумик Патель
источник
Усечение сброса идентификатора таблицы Что это значит? Но как насчет удаления?
Рави
1
@jWeaver: это означает, что если для свойства Identity Specification задано значение True для поля первичного ключа, то при вставке данных в эту таблицу столбец первичного ключа содержит значение, подобное 1,2,3,4,5 .... (если Identity начинается из 1 и seed равно 1), и когда вы усекаете таблицу, она потеряет все значение идентификатора, поэтому, когда вы начнете вставлять данные в эту таблицу снова, они начнутся с 1 вместо того, где они остались последними. В DELETE, наоборот, он сохраняет значение идентичности даже после выполнения инструкции DELETE. Извините за ошибку 2-й точки сравнения в столбце УДАЛИТЬ на изображении выше.
Баумик Патель
Похоже, вы отвечаете за SQL SERVER
Рави
4
И TRUNCATE, и DELETE могут быть откатаны назад в SQL SERVER . А во 2-м ряду УДАЛИТЬ дозу не сбрасывать личность. Теперь, как вы можете редактировать этот пост? Это плохо в использовании изображений в StackOverflow.
Махмуд Дженами
2
Усечение откатывается! (SQL SERVER)
Аймал Хан
55

DROP

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

TRUNCATE

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

УДАЛИТЬ

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

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

Мохит Сингх
источник
5
Хорошее объяснение для новичка, как я
Викас Кукрети
Короткий и сладкий
ABH
23

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

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

Polara
источник
Ах, триггеры ... это хороший момент. Я добавлю это к списку, который я сделал, и заплачу тебе Полару, если все в порядке.
Дэвид Олдридж
SQL Server не позволит вам усечение таблицы с внешними ключами, так что ваша точка каскадных может быть спорным, в зависимости от платформы.
Meff
PostgreSQL имеет «TRUNCATE Trigger»
a_horse_with_no_name
17

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

Матье
источник
Для пояснения, это для SQL Server, если в таблице есть столбец, определенный как IDENTITY. Удалить будет поддерживать последний автоматически назначенный идентификатор, в то время как Truncate сбрасывает счетчик.
Codewerks
Так как вопрос помечен как ORACLE, то этот ответ НЕПРАВИЛЬНЫЙ, поэтому опущен.
Парень
упс, не увидел метку оракула :)
mathieu
+1 правда, и он сбрасывает его до 0 . Если вы хотите, чтобы это было 1 вместо:DBCC CHECKIDENT (table_name, RESEED, 1)
JohnB
Я добавил это в ответ сообщества и сделал его более удобным для документирования проблем, связанных с поставщиками
Дэвид Олдридж
12

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

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

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

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

Уолтер Митти
источник
7

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

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

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

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

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

Вот очень хорошая ссылка, относящаяся к теме.

Сачин Чоурасия
источник
6

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

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

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

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

DCookie
источник
PostgreSQL также похож на это.
Гэвин М. Рой
6

TRUNCATE

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

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

УДАЛИТЬ

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

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

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

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

При работе с базой данных мы используем Delete и Truncate, не зная различий между ними. В этой статье мы обсудим разницу между Delete и Truncate в Sql.

Удалить:

  • Удалить - это команда DML.
  • Оператор удаления выполняется с использованием блокировки строк, каждая строка в таблице блокируется для удаления.
  • Мы можем указать фильтры в предложении where.
  • Удаляет указанные данные, если существует условие.
  • Удалите действия триггера, потому что операция регистрируется индивидуально.
  • Медленнее, чем усекать, потому что он ведет журналы

Округление

  • Усечение - это команда DDL.
  • Усеченная таблица всегда блокирует таблицу и страницу, но не каждую строку. Так как она удаляет все данные.
  • Не может использовать Где условие.
  • Удаляет все данные.
  • Усеченная таблица не может активировать триггер, поскольку операция не регистрирует удаления отдельных строк.
  • Быстрее с точки зрения производительности, потому что он не ведет журналы.

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

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

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

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

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

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


источник
4

УДАЛИТЬ

Команда 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

MyUserQuestion
источник
Это добавляет что-то к текущим ответам?
Дэвид Олдридж
3

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 можно откатить.

SQLnbe
источник
2

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

SQL> delete from t1;

10918 rows deleted.

Elapsed: 00:00:00.58

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




Statistics
----------------------------------------------------------
         30  recursive calls
      12118  db block gets
        213  consistent gets
        142  physical reads
    3975328  redo size
        441  bytes sent via SQL*Net to client
        537  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          2  sorts (memory)
          0  sorts (disk)
      10918  rows processed
CaptainPicard
источник
его старый поток, но, согласно моему пониманию, усечение только генерирует хорошее количество повторного журнала, где удаление генерирует отмену и повтор обоих.
Саурабх Синха
2

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

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

Предложение FROM : с помощью команды 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 используется против View, этот View должен быть представлением с возможностью обновления. TRUNCATE нельзя использовать для таблицы, используемой в индексированном представлении.
TRUNCATE нельзя использовать для таблицы, на которую ссылается ограничение FOREIGN KEY, если только таблица не имеет внешнего ключа, который ссылается на себя.

Мангал Пардеши
источник
Привет Мангал - спасибо за ответ, особенно за вопросы, связанные с SQL * Server. Как вы думаете, вы могли бы объединить эти моменты с принятым вики-сообществом ответом?
Дэвид Олдридж
Да, конечно, но как и где? Извините, я новичок здесь.
Мангал Пардеши
«Так что, если вы хотите сохранить счетчик идентификаторов, используйте DELETE», вы могли бы использоватьDECLARE @ai as bigint SET @ai =IDENT_CURRENT('tablename') TRUNCATE TABLE tablename DBCC checkident('tablename', RESEED, @ai)
mpag
1

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

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

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

Обучение
источник
1

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

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

DELETE FROM table_name [WHERE условие];

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

Бхушан Патил
источник
1

УДАЛИТЬ

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/

user27332
источник
1

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

westyside
источник
0

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

Oskar
источник
0

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

Джордан Огрен
источник
0

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

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

Натан
источник
0

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

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

user2587360
источник
0

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

begin Tran
delete from  Employee

select * from Employee
Rollback
select * from Employee
Виная Пандит
источник
0

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

Пожалуйста, проверьте нажмите здесь

wpzone4u
источник
0

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

Джеральд
источник
0

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

Али
источник
0

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

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

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

Михаил Сенютович
источник