SQL TRUNCATE TABLE

TRUNCATE TABLE в SQL: мгновенная очистка всех строк таблицы, сброс автоинкремента и отличие от DELETE — когда что применять.

TRUNCATE TABLE удаляет все строки таблицы за одно действие, сохраняя её структуру, столбцы, индексы и ограничения — как новая пустая таблица.

Синтаксис

TRUNCATE TABLE имя_таблицы;

Пример: очистка таблицы

Создадим таблицу с данными и очистим её:

CREATE TABLE orders_demo (
    id     INTEGER PRIMARY KEY,
    item   TEXT NOT NULL,
    amount INTEGER
);

INSERT INTO orders_demo VALUES
    (1, 'Яблоки', 5),
    (2, 'Груши',  3),
    (3, 'Сливы',  8);

-- Перед очисткой — посмотрим
SELECT COUNT(*) AS before_truncate FROM orders_demo;

-- Очищаем
DELETE FROM orders_demo;  -- SQLite не поддерживает TRUNCATE, используем DELETE

-- После очистки
SELECT COUNT(*) AS after_truncate FROM orders_demo;

Результат:

+-----------------+
| before_truncate |
+-----------------+
|               3 |
+-----------------+

+----------------+
| after_truncate |
+----------------+
|              0 |
+----------------+

Примечание. В стандартном SQL и большинстве СУБД (PostgreSQL, MySQL, SQL Server, Oracle) команда — TRUNCATE TABLE имя;. SQLite не реализует TRUNCATE; вместо него используют DELETE FROM имя; — эффект тот же.

TRUNCATE TABLE vs DELETE

Критерий

TRUNCATE TABLE

DELETE (без WHERE)

Скорость

Очень быстро — не логирует каждую строку

Медленнее — обрабатывает построчно

Условие WHERE

Не поддерживается

Поддерживается

AUTO_INCREMENT

Сбрасывается на начальное значение (обычно 1)

Не сбрасывается

Откат (ROLLBACK)

В некоторых СУБД — нельзя откатить

Откатывается в транзакции

Структура таблицы

Сохраняется

Сохраняется

Триггеры

Обычно не срабатывают

Срабатывают

Когда что выбирать

TRUNCATE TABLE — когда нужно полностью и быстро опустошить таблицу (например, сбросить тестовые данные или пересоздать кэш). DELETE — когда нужно удалить часть строк по условию или важно, чтобы сработали триггеры и транзакция была откатываемой.

Частые ошибки

  • Писать TRUNCATE TABLE с WHERE — этот оператор не поддерживает фильтры, он всегда удаляет все строки.
  • Не думать об AUTO_INCREMENT — после TRUNCATE счётчик сбрасывается, что может нарушить внешние ключи в других таблицах.

Коротко

  • TRUNCATE TABLE удаляет все строки мгновенно, сохраняя структуру таблицы.
  • Работает быстрее DELETE, но не поддерживает WHERE и сбрасывает AUTO_INCREMENT.
  • В SQLite вместо TRUNCATE используют DELETE FROM без условия.
  • Выбирайте TRUNCATE для полной быстрой очистки, DELETE — для выборочного удаления.
Проверьте себя
1. В чём главное отличие TRUNCATE TABLE от DELETE без WHERE?
ATRUNCATE можно откатить транзакцией, DELETE — нет
BTRUNCATE удаляет таблицу вместе со структурой; DELETE оставляет пустую таблицу
CTRUNCATE поддерживает условие WHERE, DELETE — нет
DTRUNCATE быстрее и сбрасывает AUTO_INCREMENT; DELETE медленнее и не сбрасывает счётчик
2. Можно ли использовать TRUNCATE TABLE с условием WHERE для удаления части строк?
AДа, синтаксис: TRUNCATE TABLE employees WHERE dept_id = 5
BДа, но только в MySQL
CДа, через подзапрос
DНет, TRUNCATE не поддерживает WHERE — он удаляет все строки
3. После TRUNCATE TABLE employees — что сохранится в базе данных?
AНичего — таблица будет полностью удалена
BСтруктура таблицы (столбцы, ограничения, индексы), но все строки данных будут удалены
CТолько первичные ключи и индексы без данных
DТаблица останется без изменений — TRUNCATE только очищает кэш
4. В таблице employees есть AUTO_INCREMENT поле emp_id. После INSERT трёх строк (emp_id = 1, 2, 3) и TRUNCATE TABLE employees — какой emp_id получит следующая вставленная строка?
A4 — AUTO_INCREMENT продолжает с последнего значения
B0 — TRUNCATE устанавливает счётчик в 0
C1 — TRUNCATE сбрасывает AUTO_INCREMENT до начального значения
DЗависит от версии MySQL