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