← Все вопросы

Как удалить базу данных в SQL?

Задан 15 дней назад414 просмотров2 ответа
6

Учусь на бэкенде, наплодил кучу тестовых баз и таблиц во время экспериментов и теперь хочу прибрать за собой. Подскажите, как правильно удалить целую базу данных, а как — отдельную таблицу? И есть ли разница между «удалить таблицу» и «очистить её от данных»? Боюсь снести что-нибудь нужное.

2 ответа

6
✓ Принятый ответ — помог автору

Сразу главное предупреждение: 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.

4

Добавлю про IF EXISTS — это не косметика, а защита от падения скриптов. Если вы дропаете базу, которой уже нет, без IF EXISTS запрос вернёт ошибку и оборвёт весь скрипт миграции. С IF EXISTS он просто молча пропустит шаг.

Ещё совет: на проде заведите привычку сначала переименовать, а удалить позже:

ALTER TABLE users RENAME TO users_old;

Пару дней всё работает на новой таблице, убедились, что старая никому не нужна — только тогда DROP TABLE users_old;. Это спасает, когда «точно ненужная» таблица внезапно оказывается нужной.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект