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

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

2.0 Middle🔥 171 комментариев
#Базы данных и SQL

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

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

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

# Разница между DELETE, TRUNCATE и DROP

Это три различные SQL команды для удаления данных, работающие на разных уровнях и с разными характеристиками.

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

Назначение: удалить конкретные строки из таблицы

DELETE FROM users WHERE age > 65;
DELETE FROM products; -- удалить все строки

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

  • ✅ Удаляет только данные, структура таблицы остаётся
  • ✅ Работает со строками (можно с WHERE условием)
  • ✅ Генерирует триггеры DELETE
  • ✅ Поддерживает ROLLBACK (транзакция)
  • ✅ Медленнее TRUNCATE (логирует каждую строку)
  • ⚠️ Счётчик IDENTITY не сбрасывается
  • ⚠️ Освобождает пространство в логах, не в самой таблице

Когда использовать: нужно удалить конкретные записи с возможностью отката

TRUNCATE — очистка таблицы

Назначение: быстро очистить всю таблицу

TRUNCATE TABLE users;

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

  • ✅ Удаляет все строки (не может быть WHERE)
  • ✅ Очень быстро (просто удаляет страницы памяти)
  • Не генерирует триггеры DELETE
  • ✅ Поддерживает ROLLBACK в транзакции
  • Сбрасывает IDENTITY на начальное значение (обычно 1)
  • ✅ Освобождает блокированное пространство
  • ❌ Нельзя удалить конкретные строки
  • ❌ На некоторых БД не работает с внешними ключами

Когда использовать: нужно быстро очистить всю таблицу без логирования

DROP — удаление таблицы

Назначение: полностью удалить таблицу со структурой

DROP TABLE users;
DROP TABLE products CASCADE; -- удаление с зависимостями

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

  • ✅ Удаляет таблицу полностью (структура + данные)
  • Очень быстро (просто удаляет определение)
  • ✅ Освобождает все пространство диска
  • ✅ Удаляет индексы, триггеры, констрейнты
  • Нельзя откатить (даже в транзакции, на некоторых БД)
  • ❌ Очень опасно!
  • ❌ Может нарушить внешние ключи других таблиц

Когда использовать: нужно полностью удалить таблицу (редко в боевом коде)

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

ХарактеристикаDELETETRUNCATEDROP
Что удаляетСтрокиВсе строкиТаблицу + структуру
WHERE условие✅ Да❌ Нет❌ Нет
Триггеры✅ Вызывает❌ Не вызывает❌ Не вызывает
ROLLBACK✅ Да✅ Да⚠️ Зависит от БД
Скорость🐢 Медленно⚡ Очень быстро⚡⚡ Молниеносно
Identity reset❌ Не сбрасывает✅ Сбрасывает❌ Таблица удалена
Пространство⚠️ Частично✅ Полностью✅ Полностью

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

// Java + Spring Data JPA

// DELETE — удалить конкретные пользователей
@Transactional
public void deleteInactiveUsers() {
    userRepository.deleteByLastLoginBefore(sixMonthsAgo);
}

// TRUNCATE — очистить тестовую таблицу
@Transactional
public void clearTestData() {
    entityManager.createNativeQuery("TRUNCATE TABLE test_data").executeUpdate();
}

// DROP — удалить временную таблицу (редко)
@Transactional
public void dropTempTable() {
    entityManager.createNativeQuery("DROP TABLE temp_cache").executeUpdate();
}

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

  1. Используй DELETE для удаления конкретных записей
  2. Используй TRUNCATE для очистки таблиц в тестах/миграциях
  3. Избегай DROP в production коде — это миграция
  4. Всегда оборачивай опасные операции в @Transactional
  5. Делай бэкап перед массовыми удалениями
  6. На production предпочитай soft delete (добавь is_deleted флаг)
В чем разница между DELETE, TRUNCATE и DROP? | PrepBro