Массовое удаление таблиц
Представим себе, что вам по какой-то причине надо неоднократно очищать схему вашей базы данных от всех таблиц. Допустим вы разрабатываете какой-то новый проект, когда структура таблиц в базе активно меняется. Часто после нескольких таких изменений уже сложно понять какие таблицы имеют актуальную структуру, а какие нет. И зачастую проще удалить все старые таблицы и создать их заново, чтобы убедиться в работоспособности приложения. Также часто используют фреймворки миграций баз данных, например, liquibase. И до выхода первого релиза нет смысла плодить чейнджсеты. Все изменения вносятся в один. И после очередного внесения изменений, приходится зачищать все старые таблицы, чтобы при старте приложения они пересоздались уже с доработками.
Конечно же всем известна команда DROP TABLE, которая удаляет конкретную таблицу. И для одной-двух таблиц это работает замечательно. Но когда таблиц у вас накопилось уже с десяток, да они еще связаны между собой через FOREIGN KEY, здесь уже простыми командами становится пользоваться не очень удобно. И в таких случаях меня выручает вот такой простой SQL-скрипт:
DO $$
DECLARE
tbl record;
BEGIN
FOR tbl IN
SELECT tablename
FROM pg_tables
WHERE schemaname = 'myschem' -- Укажите имя вашей схемы в БД
LOOP
EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(tbl.tablename) || ' CASCADE';
RAISE NOTICE 'Удалена таблица: %', tbl.tablename;
END LOOP;
END $$;
Здесь сначала выполняется SELECT к системному представлению (view) pg_tables c отбором по схеме, который возвращает список всех таблиц схемы. И уже далее, в цикле, для каждой таблицы выполняется все тот же банальный DROP TABLE. И не забываем CASCADE для корректного удаления зависимостей.
Пользоваться очень удобно. Не надо каждый раз при изменении списка таблиц в БД добавлять или удалять очередной DROP TABLE под конкретную таблицу. Ну а если потребовалось удалить таблицы в другой схеме, достаточно всего лишь поменять в скрипте имя схемы.