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

«В чем разница между операторами DELETE и TRUNCATE в SQL?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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: Для быстрой полной очистки таблицы, когда данные не нужны и триггеры/откат не требуются.