← Назад к вопросам

В чем разница между DELETE и TRUNCATE в SQL?

1.0 Junior🔥 61 комментариев
#SQL и базы данных

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Различия между DELETE и TRUNCATE в SQL

DELETE и TRUNCATE — это два различных подхода к удалению данных из таблицы в SQL, и они имеют существенные различия в механизме работы, производительности и функциональности.

DELETE — построчное удаление

DELETE — это DML-команда (Data Manipulation Language), которая удаляет строки из таблицы одну за другой. Это операция пошагового удаления с логированием каждого шага.

DELETE FROM employees WHERE department_id = 5;

Характеристики DELETE:

  • Логирование: каждое удаление записывается в журнал транзакций (WAL)
  • Медленнее: требует больше ресурсов и времени на больших объёмах
  • Где-условия: поддерживает WHERE для селективного удаления
  • Откатываемость: можно откатить в транзакции (ROLLBACK)
  • Триггеры: срабатывают DELETE триггеры
  • Identity (Identity Seeds): счётчик автоинкремента не сбрасывается
  • Место на диске: освобождаемое место не возвращается сразу БД

TRUNCATE — быстрое очищение

TRUNCATE — это DDL-команда (Data Definition Language), которая полностью очищает таблицу, удаляя всё содержимое за одну операцию. Это деаллокация страниц данных.

TRUNCATE TABLE employees;

Характеристики TRUNCATE:

  • Минимальное логирование: логирует только деаллокацию, не каждую строку
  • Очень быстро: значительно быстрее DELETE на больших таблицах
  • Без WHERE: удаляет ВСЕ строки, условия не поддерживает
  • Откатываемость: в некоторых БД откатывается, но с ограничениями
  • Триггеры: НЕ срабатывают DELETE триггеры
  • Identity (Identity Seeds): счётчик сбрасывается на начальное значение
  • Место на диске: немедленно возвращает всё выделенное место

Сравнительная таблица

КритерийDELETETRUNCATE
Тип командыDMLDDL
ЛогированиеПолное (каждая строка)Минимальное (деаллокация)
ПроизводительностьМедленно на больших объёмахОчень быстро
WHERE условиеПоддерживаетсяНЕ поддерживается
Откат (ROLLBACK)ДаЗависит от БД/версии
Триггеры DELETEСрабатываютНЕ срабатывают
IDENTITY сбросНе сбрасываетсяСбрасывается
Место на дискеПостепенное освобождениеНемедленное освобождение
БлокировкаСтрокиТаблица целиком

Примеры использования

-- DELETE с условием (только активные сотрудники)
DELETE FROM employees 
WHERE status = 'inactive' 
AND hire_date < '2020-01-01';

-- TRUNCATE очищает таблицу полностью
TRUNCATE TABLE employees;

-- Откат DELETE в транзакции
BEGIN TRANSACTION;
DELETE FROM employees WHERE id = 100;
ROLLBACK; -- Отменяет удаление

-- TRUNCATE в PostgreSQL (работает в транзакции)
BEGIN;
TRUNCATE TABLE employees;
ROLLBACK; -- Отменяет очищение

Практические рекомендации

Используй DELETE когда:

  1. Нужно удалить строки по условию (WHERE)
  2. Требуется откатываемость операции
  3. Нужно срабатывание триггеров
  4. Нужно сохранить IDENTITY последовательность
  5. Небольшой объём удаляемых данных

Используй TRUNCATE когда:

  1. Нужно полностью очистить таблицу
  2. Требуется максимальная производительность
  3. Не нужны триггеры и условия
  4. Можно сбросить IDENTITY счётчик
  5. Большой объём данных
  6. Нужно немедленно освободить дисковое пространство

Примечание по безопасности

в Production окружении будьте осторожны с TRUNCATE — это необратимая операция в некоторых сценариях. Всегда создавайте бэкапы перед массовым удалением данных. Для критичных данных предпочитайте DELETE с WHERE, так как это даёт больше контроля и откатываемости.