Ответ
Обе команды удаляют данные из таблицы, но принципиально различаются по механизму и последствиям.
| Аспект | DELETE | TRUNCATE |
|---|---|---|
| Условие | Может использовать WHERE для выборочного удаления. |
Удаляет все строки таблицы. Условие WHERE не поддерживается. |
| Журналирование | Каждое удаление строки логируется (записывается в журнал транзакций). Это позволяет выполнить ROLLBACK. |
Обычно журналируется только освобождение страниц данных, что делает операцию невозвратной в большинстве СУБД (после коммита). |
| Триггеры | Запускает триггеры DELETE. |
Не запускает триггеры. |
| Скорость | Медленнее, особенно на больших таблицах, так как удаляет строки по одной. | Значительно быстрее, так как освобождает данные на уровне страниц (деаллоцирует экстенты). |
| Автоинкремент (IDENTITY) | Не сбрасывает счетчик. | Сбрасывает счетчик автоинкремента до начального значения (обычно 1). |
Примеры:
-- DELETE: Удалить конкретные записи. Операцию можно откатить.
DELETE FROM Orders WHERE order_date < '2023-01-01';
-- TRUNCATE: Мгновенно очистить всю таблицу. Практически необратимо.
TRUNCATE TABLE AuditLog;
Вывод: Используйте DELETE для выборочного, контролируемого удаления с возможностью отката. Используйте TRUNCATE для быстрой и полной очистки таблицы, когда данные больше не нужны.