БЕСПЛАТНОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ

Массовое удаление таблиц

Представим себе, что вам по какой-то причине надо неоднократно очищать схему вашей базы данных от всех таблиц. Допустим вы разрабатываете какой-то новый проект, когда структура таблиц в базе активно меняется. Часто после нескольких таких изменений уже сложно понять какие таблицы имеют актуальную структуру, а какие нет. И зачастую проще удалить все старые таблицы и создать их заново, чтобы убедиться в работоспособности приложения. Также часто используют фреймворки миграций баз данных, например, 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 под конкретную таблицу. Ну а если потребовалось удалить таблицы в другой схеме, достаточно всего лишь поменять в скрипте имя схемы.