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

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

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

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

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

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

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

Механизм удаления данных

DELETE — это DML-команда (Data Manipulation Language), которая удаляет строки одну за одной:

DELETE FROM users WHERE age > 50;

Для каждой удаляемой строки база данных:

  1. Применяет WHERE условие
  2. Генерирует запись в transaction log
  3. Запускает триггеры DELETE
  4. Возвращает количество удалённых строк

TRUNCATE — это DDL-команда (Data Definition Language), которая физически пересоздаёт таблицу:

TRUNCATE TABLE users;

Таблица очищается целиком, независимо от данных.

Производительность

DELETE медленнее, так как:

  • Проверяет каждую строку
  • Создаёт записи в логе для каждой операции
  • Запускает триггеры (если они есть)
  • Требует больше памяти и CPU

TRUNCATE быстрее, так как:

  • Просто освобождает страницы памяти
  • Не логирует отдельные удаления
  • Не запускает триггеры

Для таблицы с миллионом строк:

// DELETE может работать минуты
await db.query(`DELETE FROM huge_table`);

// TRUNCATE выполняется за миллисекунды
await db.query(`TRUNCATE TABLE huge_table`);

Откат транзакции

DELETE полностью откатываемый:

BEGIN TRANSACTION;
DELETE FROM users;
ROLLBACK; -- все строки восстановлены

TRUNCATE тоже откатываемый в транзакции, но с особенностями:

BEGIN TRANSACTION;
TRUNCATE TABLE users;
ROLLBACK; -- в PostgreSQL/MySQL откатится
-- в SQL Server откатится если TRUNCATE внутри транзакции

Однако в некоторых СУБД (как SQL Server с определёнными настройками) TRUNCATE может быть необратимым вне транзакции.

Identity/Sequence

DELETE НЕ сбрасывает счётчик identity/sequence:

INSERT INTO users (name) VALUES (Alice); -- id = 1
INSERT INTO users (name) VALUES (Bob);   -- id = 2
DELETE FROM users;
INSERT INTO users (name) VALUES (Charlie); -- id = 3 (счётчик продолжается)

TRUNCATE сбрасывает счётчик:

TRUNCATE TABLE users; -- sequence сбросилась
INSERT INTO users (name) VALUES (Charlie); -- id = 1

В Node.js приложениях это может вызвать проблемы, если полагаться на конкретные ID:

// Тестовая очистка БД
async function cleanDatabase() {
  // Правильно: TRUNCATE для тестов
  await db.query(`TRUNCATE TABLE users RESTART IDENTITY`);
  await db.query(`TRUNCATE TABLE posts RESTART IDENTITY`);
}

Ограничения с foreign keys

DELETE работает с foreign keys обычно:

DELETE FROM users WHERE id = 5; -- проверит ограничения

TRUNCATE может требовать отключения ограничений:

-- PostgreSQL
TRUNCATE TABLE users CASCADE; -- удалит зависимые данные

-- MySQL требует отключения проверки
SET FOREIGN_KEY_CHECKS=0;
TRUNCATE TABLE users;
SET FOREIGN_KEY_CHECKS=1;

Когда использовать что

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

  • Нужно удалить конкретные строки (WHERE условие)
  • Нужны триггеры
  • Требуется откатываемость с возвращением количества удалённых строк
  • Работаешь с foreign keys без каскадного удаления

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

  • Нужно полностью очистить таблицу
  • Требуется максимальная производительность
  • Нужно сбросить identity/sequence
  • Очищаешь тестовые данные
// В Node.js тестах
async function setupTestDatabase() {
  // Для чистоты данных
  await db.query(`TRUNCATE TABLE users RESTART IDENTITY CASCADE`);
  await db.query(`TRUNCATE TABLE posts RESTART IDENTITY CASCADE`);
}

Заключение

Выбор между DELETE и TRUNCATE зависит от задачи. DELETE — универсальный инструмент с более гибким управлением, TRUNCATE — специализированный для полной очистки больших таблиц. В production Node.js приложениях DELETE используется чаще, так как предоставляет больше контроля.

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