Собесов

TRUNCATE vs DELETE vs DROP: чем отличаются

SQLDDL и DMLЛёгкаяJunior

Условие

В чём разница между TRUNCATE, DELETE и DROP? Какая команда используется для создания таблицы?

Решение

CREATE TABLE — создание

CREATE TABLE clients (
  id   BIGSERIAL PRIMARY KEY,
  name TEXT NOT NULL
);

DDL-команда. Создаёт структуру.

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

DELETE FROM clients WHERE id < 100;
DELETE FROM clients;             -- удалить ВСЕ строки
Свойство DELETE
Что удаляет Строки по условию или все
Структура таблицы Сохраняется
WHERE Опциональный
Срабатывают триггеры Да
Логирование (журнал) Каждая строка
Скорость Медленно для больших таблиц
Откат Да (внутри транзакции)
Auto-increment Не сбрасывается

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

TRUNCATE TABLE clients;
TRUNCATE TABLE clients RESTART IDENTITY CASCADE;  -- PG
Свойство TRUNCATE
Что удаляет Все строки
Структура таблицы Сохраняется
WHERE Нельзя
Срабатывают триггеры Обычно нет
Логирование Минимальное
Скорость Очень быстро
Откат В PG — да, в MySQL — нет
Auto-increment Сбрасывается (или опционально)

В большинстве СУБД TRUNCATE относится к DDL (меняет метаданные/files напрямую).

DROP TABLE — удаление таблицы целиком

DROP TABLE clients;
DROP TABLE IF EXISTS clients CASCADE;
Свойство DROP
Что удаляет Структуру таблицы и все данные
Восстановление Только из backup
FK на эту таблицу Нужен CASCADE или предварительное удаление
Откат В PG — да (внутри транзакции), в MySQL — нет

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

DELETE TRUNCATE DROP
Подъязык DML DDL DDL
Удаляет данные Да Да Да
Удаляет структуру Нет Нет Да
Может с WHERE Да Нет Нет
Триггеры Да Обычно нет Нет
Скорость Медленно Быстро Быстро
Сбрасывает PK serial Нет Да (таблицы нет)

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

  • Удалить часть строкDELETE WHERE.
  • Очистить таблицу полностью, оставить структуруTRUNCATE.
  • Полностью удалить таблицуDROP TABLE.
  • Тестовый сброс перед прогономTRUNCATE (быстрее, сбрасывает sequences).

Опасность

  • DELETE без WHERE удалит ВСЕ строки. Защита: транзакции, права RBAC.
  • TRUNCATE нельзя откатить в MySQL — потерянные данные не восстановить без бэкапа.
  • DROP ещё страшнее: потеря структуры. В продакшене — только через миграции с code review.

Подводные камни

  1. TRUNCATE без RESTART IDENTITY — sequence не сбрасывается, новые строки получат высокие ID.
  2. FK referencesTRUNCATE без CASCADE упадёт, если на таблицу ссылаются другие.
  3. DELETE FROM t перед INSERT — медленнее TRUNCATE; INSERT. Для очистки и заполнения используйте TRUNCATE.
  4. Атомарность DDL в PostgreSQL — DROP TABLE внутри транзакции откатывается; в MySQL DDL автоматически коммитит.

Эталонный ответ

  • CREATE TABLE — создаёт таблицу.
  • DELETE (DML) — удаляет строки, сохраняет структуру; есть WHERE; срабатывают триггеры.
  • TRUNCATE (DDL) — очищает таблицу полностью, быстро, сбрасывает sequence; без WHERE.
  • DROP TABLE (DDL) — удаляет таблицу вместе со структурой.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти