← Все вопросы

Чем TRUNCATE TABLE отличается от DELETE и DROP? Хочу очистить таблицу

Задан 31 месяц назад616 просмотров2 ответа
6

Нужно полностью очистить таблицу с тестовыми данными перед прогоном. Нашёл три варианта и запутался: DELETE, TRUNCATE TABLE и DROP TABLE. Что выбрать, если данные надо убрать, а саму таблицу оставить?

DELETE FROM logs;
TRUNCATE TABLE logs;
DROP TABLE logs;

В чём практическая разница между ними?

2 ответа

11
✓ Принятый ответ — помог автору

Коротко: для «очистить таблицу, но оставить её» подходят 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.

4

Подводный камень: TRUNCATE обычно нельзя выполнить, если на таблицу ссылается внешний ключ (FOREIGN KEY) из другой таблицы — СУБД не даст. В таком случае придётся либо чистить через DELETE, либо временно снимать ограничение. Ещё TRUNCATE относится к DDL и в некоторых СУБД неявно фиксирует транзакцию (его сложнее откатить), а DELETE — обычный DML и откатывается штатно.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект