Чем отличаются SQL-команды DELETE и TRUNCATE

Ответ

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

DELETE — это операция DML (Data Manipulation Language). Она удаляет строки по одной и записывает каждую удаленную строку в лог транзакций. Это делает операцию медленной, но гибкой и безопасной.

TRUNCATE — это операция DDL (Data Definition Language). Она не сканирует строки, а мгновенно удаляет все данные, освобождая занимаемые таблицей страницы данных (или создавая новую пустую структуру). Это делает её чрезвычайно быстрой, но менее гибкой.

Сравнительная таблица

Характеристика DELETE TRUNCATE
Тип операции DML (Data Manipulation Language) DDL (Data Definition Language)
Условие WHERE Можно использовать для выборочного удаления Нельзя использовать, удаляет все строки
Скорость Медленнее (сканирует и логгирует строки) Значительно быстрее (не логгирует каждую строку)
Откат (Rollback) Возможен, т.к. является частью транзакции Невозможен в большинстве СУБД (или требует спец. настроек)
Триггеры Активирует триггеры ON DELETE для каждой строки Не активирует триггеры
Счетчик AUTO_INCREMENT Не сбрасывается Сбрасывается к начальному значению
Блокировки Устанавливает блокировки на удаляемые строки Устанавливает блокировку на всю таблицу

Практические примеры

-- Удалить только неактивных пользователей (медленно, но безопасно)
-- Эту операцию можно откатить (ROLLBACK)
DELETE FROM users WHERE status = 'inactive';

-- Полностью и безвозвратно очистить таблицу логов (очень быстро)
-- Счётчик ID будет сброшен
TRUNCATE TABLE event_logs;

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

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

Ответ 18+ 🔞

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

DELETE — это как аккуратный, но дохуя медленный уборщик. Операция DML, понимаешь? Он идёт по таблице, каждую строчку сканирует, в лог транзакций записывает, триггеры активирует. Можно с ним договориться: «Слушай, удали-ка мне только вот этих пидарасов, у которых status = 'inactive'». И главное — если передумал, можно всё откатить, как будто ничего и не было. Удобно, но овердохуища времени занимает.

TRUNCATE — это уже не уборщик, а бульдозер, ёпта. Операция DDL, то есть он не возится со строками. Он просто берёт и выносит всю таблицу к ебеням, освобождая место. Мгновенно, без разговоров. Никаких WHERE, никаких триггеров, автоинкремент сбрасывает к началу. Откатить эту пиздабольскую атаку в большинстве случаев — нихуя не получится. Быстро, жёстко, безвозвратно.

Короче, смотри таблицу, чтобы не быть мудаком:

Признак DELETE TRUNCATE
Что это? DML (копается в данных) DDL (ломает структуру)
Можно ли по условию? Да, WHERE работает Нихуя, удаляет всё
Скорость Медленный, как черепаха в сиропе Быстрый, как хуй с горы
Откат (Rollback) Да, можно отменить Обычно нет, прощай, данные
Триггеры Срабатывают на каждую строку Игнорирует нахуй
Счётчик AUTO_INCREMENT Не трогает Сбрасывает к началу
Блокировки На каждую строку На всю таблицу разом

Примеры из жизни, чтобы совсем понятно стало:

-- Удаляем только забаненных юзеров. Можно откатить, если начальник передумал.
-- Триггеры на удаление отработают. Медленно, но безопасно.
DELETE FROM users WHERE banned = true;

-- Полностью выносим таблицу с временными логами. Быстро, без эмоций.
-- ID снова начнутся с 1. Откатить — нихуя.
TRUNCATE TABLE temp_logs;

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

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