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

Ответ

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

DELETE

  • Удаляет строки по условию с помощью предложения WHERE. Без WHERE удаляет все строки, но делает это построчно.
  • Поддерживает транзакции: операцию можно откатить с помощью ROLLBACK (если выполняется в явной транзакции).
  • Активирует триггеры DELETE.
  • Медленнее для больших таблиц, так как каждая удаляемая строка записывается в журнал транзакций (для возможности отката).
  • Не сбрасывает счетчики автоинкрементных полей (IDENTITY/SEQUENCE).
-- Выборочное удаление
DELETE FROM orders WHERE status = 'cancelled';
-- Удаление всех строк (медленно)
DELETE FROM temp_log;

TRUNCATE

  • Удаляет ВСЕ строки в таблице мгновенно. Не поддерживает WHERE.
  • Нельзя откатить в большинстве СУБД (работает как DDL-операция, выполняет неявный COMMIT).
  • Не активирует триггеры DELETE.
  • Значительно быстрее, так как освобождает данные на уровне экстентов/страниц, минимально логируя.
  • Сбрасывает счетчик автоинкрементного поля до начального значения.
  • Требует более высоких привилегий (обычно ALTER TABLE).
-- Быстрая очистка всей таблицы
TRUNCATE TABLE session_cache;

Практическое правило

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

Ответ 18+ 🔞

Да ты посмотри, какие у нас тут два монстра подъехали — DELETE и TRUNCATE! Оба, вроде как, таблицу чистят, а ведут себя, как будто с разных планет упали. Сейчас разберём эту пиздопроебищну, чтобы ты не накосячил.

DELETE — это такой, знаешь, педантичный уборщик. Он приходит с метёлкой и совочком и говорит: «Сейчас я каждую строчечку аккуратненько, по одной, вымету». Если ему сказать WHERE status = 'cancelled', он только отменённые заказы и тронет. А если не указать условие — он всё равно будет эту хуйню делать построчно, всё в журнал записывая, на случай если начальство передумает и скажет «верни как было!» (это ROLLBACK). Автоинкремент после него не сбрасывается, триггеры срабатывают. В общем, бюрократ, блядь.

-- Вот так он отменит только долбоёбов, которые не оплатили
DELETE FROM users WHERE last_payment_date IS NULL;

А теперь смотри сюда, подъезжает TRUNCATE — это уже не уборщик, а бульдозер, ёпта. Он не спрашивает «что удалить?». Он приезжает, смотрит на таблицу и говорит: «Всё нахуй». Раз — и таблица пуста. Никаких WHERE, никаких компромиссов. Журналы почти не пишет, откатить эту дичь — хер тебе, а не ROLLBACK, в большинстве баз. Триггеры не вздрогнут. Зато скорость — овердохуища, потому что он не строки стирает, а сразу целые блоки данных освобождает. И да, автоинкремент обнулит до единицы, будто ничего и не было. Но и прав нужно больше — обычно ALTER на таблицу.

-- Всё. Точка. Нет таблицы. Быстро и без эмоций.
TRUNCATE TABLE temporary_upload_junk;

Так когда что юзать, чтобы не облажаться?

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

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