Как удалить базу данных в SQL?
Учусь на бэкенде, наплодил кучу тестовых баз и таблиц во время экспериментов и теперь хочу прибрать за собой. Подскажите, как правильно удалить целую базу данных, а как — отдельную таблицу? И есть ли разница между «удалить таблицу» и «очистить её от данных»? Боюсь снести что-нибудь нужное.
2 ответа
Сразу главное предупреждение: DROP DATABASE и DROP TABLE — операции необратимые. Никакой корзины нет, откатить нельзя (в большинстве СУБД DDL даже не участвует в транзакции или коммитится сразу). Перед удалением чего-либо на проде — делайте бэкап.
Разберём по уровням.
1. Удалить целую базу данных:
-- снесёт базу целиком со всеми таблицами и данными
DROP DATABASE shop;
-- безопаснее: не упадёт с ошибкой, если базы уже нет
DROP DATABASE IF EXISTS shop;
2. Удалить одну таблицу (структура + данные):
DROP TABLE IF EXISTS orders;
3. Очистить таблицу, но оставить её структуру:
TRUNCATE TABLE orders; -- быстро удаляет ВСЕ строки
DELETE FROM orders; -- то же, но построчно и с WHERE
DELETE FROM orders WHERE status = 'draft'; -- удалить только часть
Ключевая разница: DROP уничтожает сам объект, а TRUNCATE/DELETE — только строки внутри. После TRUNCATE таблица остаётся, в неё можно сразу вставлять данные.
Подводные камни:
- В PostgreSQL нельзя дропнуть базу, к которой есть активные подключения — сначала отключите всех (или используйте
DROP DATABASE shop WITH (FORCE);в PG 13+). - Нужны соответствующие права (обычно владелец БД или суперпользователь).
TRUNCATEнельзя применить, если на таблицу ссылается внешний ключ из непустой таблицы.
Вывод: для разовой уборки — DROP ... IF EXISTS, для регулярного обнуления данных — TRUNCATE.
Добавлю про IF EXISTS — это не косметика, а защита от падения скриптов. Если вы дропаете базу, которой уже нет, без IF EXISTS запрос вернёт ошибку и оборвёт весь скрипт миграции. С IF EXISTS он просто молча пропустит шаг.
Ещё совет: на проде заведите привычку сначала переименовать, а удалить позже:
ALTER TABLE users RENAME TO users_old;
Пару дней всё работает на новой таблице, убедились, что старая никому не нужна — только тогда DROP TABLE users_old;. Это спасает, когда «точно ненужная» таблица внезапно оказывается нужной.