Чем отличаются 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, когда нужно быстро и полностью очистить таблицу (например, временную или таблицу логов), и сброс автоинкремента является желаемым поведением.