Ответ
DELETE и TRUNCATE — это SQL-команды для удаления данных из таблицы, но их механизм, производительность и возможности кардинально различаются.
| Критерий | DELETE | TRUNCATE |
|---|---|---|
| Синтаксис и цель | DELETE FROM table_name [WHERE condition]; Удаляет строки выборочно (по условию WHERE). |
TRUNCATE TABLE table_name; Удаляет все строки из таблицы. Условие WHERE не допускается. |
| Скорость и логирование | Медленнее. Каждая удаляемая строка логируется в журнале транзакций, что позволяет откат. | Быстрее (часто на порядки). Удаляет данные, деаллоцируя страницы данных. Минимальное логирование. |
| Транзакции и откат | Работает в контексте транзакции. Можно откатить командой ROLLBACK. |
В большинстве СУБД (MS SQL, PostgreSQL) также работает в транзакции и может быть откачен. В Oracle — DDL, авто-коммит. |
| Триггеры | Запускает триггеры DELETE для каждой удаляемой строки. |
Не запускает триггеры DELETE. |
| Ограничения (FK) | Может удалять строки, на которые есть ссылки, если каскадное удаление не настроено (вызовет ошибку). | Не может удалить строки, если на таблицу ссылается ограничение FOREIGN KEY (требует его отключения). |
| Сброс идентификатора (IDENTITY/AUTO_INCREMENT) | Не сбрасывает счетчик автоинкремента. Следующая вставка продолжит нумерацию. | Сбрасывает счетчик автоинкремента до начального значения. |
Практический выбор:
- Используйте
DELETE, когда нужен выборочный откатываемый удаление, или важны триггеры. - Используйте
TRUNCATE, когда нужно быстро и полностью очистить большую таблицу, и вы уверены в своих действиях.