Чем TRUNCATE TABLE отличается от DELETE и DROP? Хочу очистить таблицу
Нужно полностью очистить таблицу с тестовыми данными перед прогоном. Нашёл три варианта и запутался: DELETE, TRUNCATE TABLE и DROP TABLE. Что выбрать, если данные надо убрать, а саму таблицу оставить?
DELETE FROM logs;
TRUNCATE TABLE logs;
DROP TABLE logs;
В чём практическая разница между ними?
2 ответа
Коротко: для «очистить таблицу, но оставить её» подходят DELETE и TRUNCATE. DROP удаляет саму таблицу целиком.
DELETE FROM logs;
- Удаляет строки по одной, можно с условием:
DELETE FROM logs WHERE level = 'debug'; - Пишет каждую строку в журнал транзакций → медленно на больших таблицах.
- Откатывается через
ROLLBACK(в транзакции). - Счётчик автоинкремента (identity) обычно НЕ сбрасывается.
TRUNCATE TABLE logs;
- Очищает таблицу целиком, условие
WHEREпоставить нельзя. - Работает быстро: не удаляет построчно, а освобождает страницы данных.
- Обычно сбрасывает автоинкремент к стартовому значению.
- Структура таблицы (колонки, индексы) остаётся.
DROP TABLE logs;
- Удаляет ВСЮ таблицу: и данные, и структуру. После этого
SELECT * FROM logsвыдаст ошибку «таблица не существует».
Итог для твоей задачи: если надо быстро снести все тестовые данные и оставить пустую таблицу — бери TRUNCATE TABLE logs;. Если нужно удалить только часть строк по условию — DELETE с WHERE.
Подводный камень: TRUNCATE обычно нельзя выполнить, если на таблицу ссылается внешний ключ (FOREIGN KEY) из другой таблицы — СУБД не даст. В таком случае придётся либо чистить через DELETE, либо временно снимать ограничение. Ещё TRUNCATE относится к DDL и в некоторых СУБД неявно фиксирует транзакцию (его сложнее откатить), а DELETE — обычный DML и откатывается штатно.