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

Ответ

Оба оператора удаляют данные из таблицы, но делают это принципиально разными способами.

Аспект DELETE TRUNCATE TABLE
Синтаксис DELETE FROM table_name [WHERE ...]; TRUNCATE TABLE table_name;
Условие WHERE Поддерживается. Можно удалять конкретные строки. Не поддерживается. Удаляет все строки всегда.
Скорость Медленнее. Удаляет строки по одной, записывая каждое удаление в журнал транзакций. Значительно быстрее. Освобождает данные, удаляя экстенты (блоки данных), минимальное логирование.
Журнал транзакций Подробное логирование каждой строки. Позволяет откатить операцию (в рамках транзакции). Логируется только освобождение страниц. В большинстве СУБД нельзя откатить (является DDL-операцией).
Триггеры Вызываются для каждой удаляемой строки. Не вызываются.
Счетчик идентификаторов (IDENTITY/AUTO_INCREMENT) Не сбрасывается. Новые записи получат следующее значение. Сбрасывается до начального значения.
Требуемые права DELETE на таблицу. Обычно более высокие права (например, DROP).

Когда использовать?

  • Используйте DELETE, когда нужно удалить часть строк или важна возможность отката.
  • Используйте TRUNCATE TABLE, когда нужно быстро удалить все строки из большой таблицы и сбросить счетчик ID.

Ответ 18+ 🔞

Ну, слушай, давай разберем эту дилемму, как два способа вынести мусор из квартиры. Один — это аккуратно, пакетик за пакетиком, а второй — это выкинуть весь холодильник в окно вместе с дверцей.

Вот смотри, DELETE — это такой педантичный зануда. Он приходит и говорит: «Так, я сейчас буду удалять строчечки. Вот эту — записал в журнал, удалил. А вот эту — о, с условием WHERE — записал, удалил. А эту, блядь, не трогаю, условие не прошла». И так, сука, по одной. Триггеры на каждой строке срабатывают, как сигнализация. Если передумал — можно всё откатить, он же всё залогировал, молодец. Но если таблица на миллион строк, это пиздец как долго. Чай успеешь заварить, сгонять в магазин, вернуться — а он всё ещё там ковыряется.

А теперь смотри на TRUNCATE TABLE. Это не операция, это, блядь, теракт. Он подходит к таблице, такой: «Всё? Все тут? А теперь, сука, ВСЕ НАХУЙ!». И БАБАХ! Не важно, что там у тебя в условиях WHERE — он их в рот не взял, он удаляет ВСЁ. Всё, что влезло. Вместо того чтобы строки перебирать, он просто берёт и освобождает целые блоки данных (эти, как их, экстенты), одним махом. Журналу транзакций пишет только: «Так, бля, страницы 1-1000 — свободны. Всё». И всё. Быстро, решительно, бесповоротно.

И вот тут, ёпта, главные подводные ебучки:

  • Триггеры? Какие, нахуй, триггеры? TRUNCATE их даже не заметит. Он не удаляет строки, он уничтожает само место, где они жили. Триггеры плачут в углу.
  • Откатить? Ха! В большинстве баз данных — нихуя. Это как спиздить у вора кошелёк — не вернёшь. Операция DDL, она часто сама себе коммитит.
  • Счётчик автоинкремента (этот, IDENTITY)? DELETE оставит как есть. Удалил ты записи до 1000, следующая будет 1001. А TRUNCATE возьмёт и обнулит этот счётчик до начального значения. Всё, с чистого листа, будто ничего и не было. Хуй с горы.
  • Права? На DELETE — да пожалуйста, обычные права. А чтобы TRUNCATE юзать, тебе часто права DROP на таблицу нужны. То есть почти что право её вообще удалить. Не каждый проходимец может такую мощь в руки взять.

Короче, вывод, чтобы не ебать мозг:

  • Юзай DELETE, когда тебе нужно выборочно почистить (WHERE condition = 'shit') или если есть тень сомнения и может понадобиться откат. Или если у тебя там триггеры важные, которые должны отработать.
  • Врубай TRUNCATE TABLE на полную, когда тебе нужно быстро и нахуй выкосить ВСЁ из большой таблицы и начать жизнь с чистого, ёбаного, листа. Скорость — овердохуищная, но последствия — окончательные.

Выбирай с умом, а то потом будешь, как Герасим, на берегу озера стоять и думать: «Что же я, мудак, сделал?».