Ответ
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 — для быстрой полной очистки таблицы, когда нужно сбросить автоинкремент и триггеры не требуются.