Как удалить таблицу или все строки — DROP, DELETE, TRUNCATE
| Задача | Команда |
|---|---|
| Удалить таблицу целиком | 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, потому что не удаляет строки по одной. Различия по СУБД:
| MySQL | PostgreSQL | SQLite | |
|---|---|---|---|
| Есть ли команда | да | да | нет — DELETE FROM без WHERE и так очищает быстро |
Счётчик id | сбрасывается | остаётся, сброс — TRUNCATE orders RESTART IDENTITY | — |
| Откат в транзакции | нельзя: фиксирует транзакцию | можно | — |
На таблицу, на которую ссылается внешний ключ, TRUNCATE не действует: в PostgreSQL — ошибка cannot truncate a table referenced in a foreign key constraint (помогает TRUNCATE … CASCADE, но он очистит и таблицы, которые ссылаются), в MySQL — тоже ошибка. Удалите сначала зависимые строки или используйте DELETE.
Удалить базу данных целиком
- SQLite — закройте все программы, которые с ней работают, и удалите файл базы (и файлы
-wal,-shmрядом с ним, если есть). - MySQL, PostgreSQL —
DROP DATABASE shop;(илиDROP DATABASE IF EXISTS shop;). PostgreSQL не удалит базу, к которой кто-то подключён, в том числе вы сами: подключитесь к другой базе.
DROP DATABASE удаляет все таблицы базы разом. На сервере с несколькими базами одна опечатка в имени сотрёт чужие данные. Перед командой выполните SHOW DATABASES; (MySQL) или \l (psql) и сделайте копию.
Файл SQLite не уменьшился
После DELETE и даже DROP TABLE файл базы SQLite остаётся прежнего размера: освободившиеся страницы переиспользуются под новые данные, но обратно на диск не отдаются. Сжать файл:
VACUUM;VACUUM пересобирает базу целиком. На большой базе это займёт время, а свободного места на диске может понадобиться до двух размеров базы. В MySQL похожую задачу решает OPTIMIZE TABLE, в PostgreSQL — VACUUM FULL.