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

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

Ответ

DELETE и TRUNCATE удаляют строки из таблицы, но делают это принципиально разными способами.

Критерий DELETE TRUNCATE
Способ работы Удаляет строки по одной, записывая каждое удаление в журнал транзакций (для возможного отката). Деаллоцирует (освобождает) целые страницы данных, на которых хранилась таблица. Работает как операция DDL.
Где условие (WHERE) Можно указать условие для выборочного удаления. Нельзя. Всегда удаляет все строки в таблице.
Скорость Медленнее, особенно для больших таблиц, из-за логгирования и проверок. Значительно быстрее, так как минимизирует логгирование (записывает только освобождение страниц).
Триггеры Запускает триггеры ON DELETE. Не запускает триггеры.
Ограничения внешнего ключа Работает, если не нарушает FOREIGN KEY. Часто не работает, если на таблицу есть активные ссылки из других таблиц (зависит от СУБД).
Автоинкремент (IDENTITY/SEQUENCE) Не сбрасывает счётчик. Следующая вставка продолжит с последнего значения. Сбрасывает счётчик до начального значения (обычно 1).
Откат (ROLLBACK) Можно откатить в рамках транзакции (т.к. операции залогированы). В большинстве СУБД (PostgreSQL, SQL Server) также можно откатить.

Примеры:

-- DELETE: Удалить конкретные записи
DELETE FROM orders WHERE status = 'cancelled';
-- После этого INSERT в orders продолжит нумерацию id с последнего удаленного +1.

-- TRUNCATE: Полностью очистить временную таблицу
TRUNCATE TABLE temp_session_data;
-- Таблица пуста, и её автоинкрементный id сброшен на 1.

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