Условие
В чём разница между 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.
Подводные камни
TRUNCATEбезRESTART IDENTITY— sequence не сбрасывается, новые строки получат высокие ID.- FK references —
TRUNCATEбезCASCADEупадёт, если на таблицу ссылаются другие. DELETE FROM tпередINSERT— медленнееTRUNCATE; INSERT. Для очистки и заполнения используйтеTRUNCATE.- Атомарность DDL в PostgreSQL —
DROP TABLEвнутри транзакции откатывается; в MySQL DDL автоматически коммитит.
Эталонный ответ
- CREATE TABLE — создаёт таблицу.
- DELETE (DML) — удаляет строки, сохраняет структуру; есть
WHERE; срабатывают триггеры. - TRUNCATE (DDL) — очищает таблицу полностью, быстро, сбрасывает sequence; без
WHERE. - DROP TABLE (DDL) — удаляет таблицу вместе со структурой.