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

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

Ответ

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

Аспект DELETE TRUNCATE
Условие Поддерживает WHERE для выборочного удаления. Удаляет все строки таблицы. Условие не применимо.
Скорость Медленнее. Каждая удаляемая строка логируется в журнале транзакций. Быстрее. Удаляет данные на уровне страниц данных, минимальное логирование.
Транзакции Можно откатить с помощью ROLLBACK (в рамках транзакции). В большинстве СУБД (например, SQL Server, PostgreSQL) не может быть отката. В MySQL — может, если выполняется в транзакции.
Автоинкремент Не сбрасывает счетчик автоинкремента. Сбрасывает счетчик автоинкремента (IDENTITY/SEQUENCE) до начального значения.
Триггеры Вызывает триггеры DELETE. Не вызывает триггеры DELETE.

Примеры:

-- DELETE: Удаляет строки, соответствующие условию
DELETE FROM orders WHERE status = 'cancelled';

-- TRUNCATE: Полностью очищает таблицу
TRUNCATE TABLE audit_log;

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

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