Глиф Учебники

Как удалить таблицу или все строки — DROP, DELETE, TRUNCATE

Справочник · SQL · 2 минуты чтения

ЗадачаКоманда
Удалить таблицу целикомDROP TABLE orders;
Удалить, если она есть (без ошибки)DROP TABLE IF EXISTS orders;
Удалить все строки, оставить таблицуDELETE FROM orders;
Быстро очистить таблицу (MySQL, PostgreSQL)TRUNCATE TABLE orders;
Удалить часть строкDELETE FROM orders WHERE …;

Все эти команды выполняются без вопроса «вы уверены?». Вернуть данные можно только из резервной копии (как её сделать) или откатом транзакции, если команда была выполнена после BEGIN и ещё нет COMMIT. Перед удалением на рабочей базе проверьте, к какой базе вы подключены.

DROP TABLE

Удаляет таблицу вместе со строками, индексами и триггерами. После неё запрос к таблице выдаст no such table (SQLite) или doesn't exist (MySQL). Таблицу, на которую ссылаются внешние ключи других таблиц, PostgreSQL удалить не даст; DROP TABLE orders CASCADE удалит её вместе с этими ключами (но не с данными других таблиц).

DELETE без WHERE

DELETE FROM orders; удаляет все строки, таблица остаётся пустой со всеми столбцами, индексами и правами. Работает во всех СУБД, проверяет внешние ключи и откатывается в транзакции. На больших таблицах — медленно: строки удаляются по одной.

TRUNCATE

TRUNCATE TABLE orders; очищает таблицу быстрее DELETE, потому что не удаляет строки по одной. Различия по СУБД:

MySQLPostgreSQLSQLite
Есть ли командададанет — DELETE FROM без WHERE и так очищает быстро
Счётчик idсбрасываетсяостаётся, сброс — TRUNCATE orders RESTART IDENTITY—
Откат в транзакциинельзя: фиксирует транзакциюможно—

На таблицу, на которую ссылается внешний ключ, TRUNCATE не действует: в PostgreSQL — ошибка cannot truncate a table referenced in a foreign key constraint (помогает TRUNCATE … CASCADE, но он очистит и таблицы, которые ссылаются), в MySQL — тоже ошибка. Удалите сначала зависимые строки или используйте DELETE.

Удалить базу данных целиком

DROP DATABASE удаляет все таблицы базы разом. На сервере с несколькими базами одна опечатка в имени сотрёт чужие данные. Перед командой выполните SHOW DATABASES; (MySQL) или \l (psql) и сделайте копию.

Файл SQLite не уменьшился

После DELETE и даже DROP TABLE файл базы SQLite остаётся прежнего размера: освободившиеся страницы переиспользуются под новые данные, но обратно на диск не отдаются. Сжать файл:

SQL
VACUUM;

VACUUM пересобирает базу целиком. На большой базе это займёт время, а свободного места на диске может понадобиться до двух размеров базы. В MySQL похожую задачу решает OPTIMIZE TABLE, в PostgreSQL — VACUUM FULL.