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 — можно, он транзакционный).