Gymterview
junior

В чем отличие между операторами DELETE и TRUNCATE?

DELETE — оператор DML, который удаляет строки поштучно с возможностью фильтрации через WHERE, задействует триггеры и может быть откачен в транзакции. TRUNCATE — оператор DDL, который мгновенно очищает всю таблицу, удаляя и пересоздавая её структуру.

Характеристика DELETE TRUNCATE
Тип оператора DML DDL
Фильтрация (WHERE) Да Нет (удаляет всё)
Триггеры Срабатывают Не срабатывают
Журналирование Построчное (медленнее) Минимальное (быстрее)
Откат (ROLLBACK) Да Зависит от СУБД (в PostgreSQL — да)
Сброс IDENTITY/SERIAL Нет Да (можно управлять RESTART/CONTINUE)
FOREIGN KEY ссылки Проверяются Не выполнится, если есть ссылки
Репликация Реплицируется Зависит от настройки

TRUNCATE значительно быстрее DELETE на больших таблицах, потому что не записывает каждую удалённую строку в журнал транзакций. Однако TRUNCATE невозможно выполнить, если на таблицу есть ссылки FOREIGN KEY из других таблиц (даже если ссылающиеся таблицы пусты — в некоторых СУБД).

На собеседовании: ключевые различия — DML vs DDL, триггеры, производительность. Частая ошибка — сказать, что TRUNCATE нельзя откатить (в PostgreSQL — можно, он транзакционный).