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

Ответ

DELETE и TRUNCATE — операторы для удаления данных, но с фундаментальными различиями в реализации и поведении.

Аспект DELETE TRUNCATE
Тип операции DML (Data Manipulation Language) DDL (Data Definition Language)
Где используется DELETE FROM table_name WHERE ... TRUNCATE TABLE table_name
Фильтрация Поддерживает WHERE для выборочного удаления. Удаляет все строки. WHERE не поддерживается.
Скорость Медленнее. Удаляет строки по одной, каждая операция логируется. Быстрее. Освобождает данные на уровне экстентов (страниц), минимальное логирование.
Транзакции Можно откатить (ROLLBACK), так как каждая удаленная строка залогирована. В большинстве СУБД (кроме некоторых, с оберткой в транзакцию) откатить нельзя.
Триггеры Срабатывают триггеры DELETE. Триггеры не срабатывают.
Ограничения (FK) Проверяет ограничения целостности. Может завершиться ошибкой, если есть ссылающиеся внешние ключи (требует CASCADE или предварительного удаления).
Счетчик идентификаторов (IDENTITY/AUTO_INCREMENT) Не сбрасывается. Сбрасывается в начальное значение.

Практический пример:

-- DELETE: Удаляет конкретного пользователя, можно откатить.
BEGIN TRANSACTION;
DELETE FROM users WHERE id = 1;
-- ROLLBACK; -- Отмена удаления

-- TRUNCATE: Мгновенно очищает всю таблицу, сбрасывает счетчик id.
TRUNCATE TABLE audit_log; -- Все данные безвозвратно удалены.

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

  • DELETE: Для выборочного удаления записей, когда нужен контроль через WHERE, откат или должны сработать триггеры.
  • TRUNCATE: Для быстрой полной очистки таблицы, когда данные не нужны и триггеры/откат не требуются.

Ответ 18+ 🔞

О, слушай, про эти две штуки, DELETE и TRUNCATE, у меня всегда в голове такая картинка возникает. Представь себе комнату, заваленную хламом дохуя.

DELETE — это как взять и аккуратненько, по одной бумажке, вынести мусор в пакет. Каждый чих записан в блокнотик, на случай если начальник (он же ROLLBACK) придет и скажет: «Нахуя вынес, положи на место!». Можно выбрать, что выкидывать: только фантики (WHERE type = 'wrapper'), а газеты оставить. Но, бля, если мусора овердохуища — это пиздец как долго.

TRUNCATE — это когда ты заходишь в эту же комнату с бульдозером, ёпта. Раз — и всё, пиздец, чисто. Никаких бумажек, никаких блокнотиков с записями, нихуя. Просто выгребаешь всё нахуй одним движением. Быстро? Ебать как быстро! Откатить? Да хуй там, всё уже на свалке. Счетчик мусорных пакетов (IDENTITY) тоже обнуляется, снова с первого.

Вот тебе табличка, чтобы не ебал мозг:

Штука DELETE TRUNCATE
Кто ты? Аккуратист с пакетами (DML) Бульдозерист в запое (DDL)
Команда DELETE FROM стол WHERE ... TRUNCATE TABLE стол
Выборка Можешь выбрать, что выкинуть (WHERE). Всё подчистую, без разбора. WHERE не катит.
Скорость Медленно, как черепаха в сиропе. Логирует каждую строку. Молниеносно. Просто помечает страницы данных как свободные.
Откат Да, можно (ROLLBACK), ибо всё залогировано. В большинстве баз — нихуя. Всё, капут.
Триггеры Срабатывают, как и положено. Игнорируются нахуй. Не сработают.
Внешние ключи Уважает их, удаляет только если нет связей. Может встать в позу и отказаться, если на таблицу кто-то ссылается.
Счетчик ID Не трогает. Нумерация продолжится. Сбрасывает в ноль, будто ничего и не было.

Пример из жизни, блядь:

-- DELETE: "Ой, я, кажется, зря удалил этого Петю, давайте вернем..."
BEGIN TRANSACTION;
DELETE FROM сотрудники WHERE имя = 'Петя';
-- Ой, бля... ROLLBACK; -- Фух, Петя спасен.

-- TRUNCATE: "Нахуй весь лог ошибок, он слишком большой!"
TRUNCATE TABLE лог_ошибок; -- Всё. Пусто. Тишина. Идентификаторы с 1 начнутся.

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

  • DELETE — когда нужно выборочно поудалять, с возможностью «ой, верните» и если важны триггеры.
  • TRUNCATE — когда нужно сказать «да похуй на всё это старьё» и очистить таблицу мгновенно и бесповоротно. Главное, чтобы на неё никто не ссылался, как пидарас шерстяной.