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

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

Ответ

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

Критерий DELETE TRUNCATE
Синтаксис и цель DELETE FROM table_name [WHERE condition];
Удаляет строки выборочно (по условию WHERE).
TRUNCATE TABLE table_name;
Удаляет все строки из таблицы. Условие WHERE не допускается.
Скорость и логирование Медленнее. Каждая удаляемая строка логируется в журнале транзакций, что позволяет откат. Быстрее (часто на порядки). Удаляет данные, деаллоцируя страницы данных. Минимальное логирование.
Транзакции и откат Работает в контексте транзакции. Можно откатить командой ROLLBACK. В большинстве СУБД (MS SQL, PostgreSQL) также работает в транзакции и может быть откачен. В Oracle — DDL, авто-коммит.
Триггеры Запускает триггеры DELETE для каждой удаляемой строки. Не запускает триггеры DELETE.
Ограничения (FK) Может удалять строки, на которые есть ссылки, если каскадное удаление не настроено (вызовет ошибку). Не может удалить строки, если на таблицу ссылается ограничение FOREIGN KEY (требует его отключения).
Сброс идентификатора (IDENTITY/AUTO_INCREMENT) Не сбрасывает счетчик автоинкремента. Следующая вставка продолжит нумерацию. Сбрасывает счетчик автоинкремента до начального значения.

Практический выбор:

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