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