Ответ
DELETE и TRUNCATE — операторы для удаления данных, но с фундаментальными различиями в реализации и поведении.
| Аспект | DELETE | TRUNCATE |
|---|---|---|
| Тип операции | DML (Data Manipulation Language) | DDL (Data Definition Language) |
| Где используется | DELETE FROM table_name WHERE ... |
TRUNCATE TABLE table_name |
| Фильтрация | Поддерживает WHERE для выборочного удаления. |
Удаляет все строки. WHERE не поддерживается. |
| Скорость | Медленнее. Удаляет строки по одной, каждая операция логируется. | Быстрее. Освобождает данные на уровне экстентов (страниц), минимальное логирование. |
| Транзакции | Можно откатить (ROLLBACK), так как каждая удаленная строка залогирована. |
В большинстве СУБД (кроме некоторых, с оберткой в транзакцию) откатить нельзя. |
| Триггеры | Срабатывают триггеры DELETE. |
Триггеры не срабатывают. |
| Ограничения (FK) | Проверяет ограничения целостности. | Может завершиться ошибкой, если есть ссылающиеся внешние ключи (требует CASCADE или предварительного удаления). |
| Счетчик идентификаторов (IDENTITY/AUTO_INCREMENT) | Не сбрасывается. | Сбрасывается в начальное значение. |
Практический пример:
-- DELETE: Удаляет конкретного пользователя, можно откатить.
BEGIN TRANSACTION;
DELETE FROM users WHERE id = 1;
-- ROLLBACK; -- Отмена удаления
-- TRUNCATE: Мгновенно очищает всю таблицу, сбрасывает счетчик id.
TRUNCATE TABLE audit_log; -- Все данные безвозвратно удалены.
Когда что использовать:
- DELETE: Для выборочного удаления записей, когда нужен контроль через
WHERE, откат или должны сработать триггеры. - TRUNCATE: Для быстрой полной очистки таблицы, когда данные не нужны и триггеры/откат не требуются.