Как удалить несколько таблиц в PostgreSQL, используя подстановочный знак - PullRequest
64 голосов
/ 17 ноября 2010

При работе с разделами часто возникает необходимость удалить все разделы одновременно.

Однако

DROP TABLE tablename*

Не работает.(Подстановочный знак не учитывается).

Существует ли элегантный (читай: легко запоминающийся) способ удаления нескольких таблиц в одной команде с подстановочным знаком?

Ответы [ 7 ]

101 голосов
/ 17 ноября 2010

Использовать список через запятую:

DROP TABLE foo, bar, baz;

Если вам действительно нужен нож, этот сделает свою работу:

CREATE OR REPLACE FUNCTION footgun(IN _schema TEXT, IN _parttionbase TEXT) 
RETURNS void 
LANGUAGE plpgsql
AS
$$
DECLARE
    row     record;
BEGIN
    FOR row IN 
        SELECT
            table_schema,
            table_name
        FROM
            information_schema.tables
        WHERE
            table_type = 'BASE TABLE'
        AND
            table_schema = _schema
        AND
            table_name ILIKE (_parttionbase || '%')
    LOOP
        EXECUTE 'DROP TABLE ' || quote_ident(row.table_schema) || '.' || quote_ident(row.table_name);
        RAISE INFO 'Dropped table: %', quote_ident(row.table_schema) || '.' || quote_ident(row.table_name);
    END LOOP;
END;
$$;

SELECT footgun('public', 'tablename');
26 голосов
/ 27 января 2012

Вот еще один хакерский ответ на эту проблему.Это работает в ubuntu и, возможно, в какой-то другой ОС тоже.выполните \dt в командной строке postgres (в моем случае командная строка работала внутри genome-terminal).Тогда вы увидите много таблиц в терминале.Теперь используйте ctrl+click-drag функциональность genome-terminal для копирования имен всех таблиц.enter image description here Откройте python, выполните некоторую обработку строк (замените '' на '', а затем '\ n' на ',') и вы получите список всех таблиц через запятуюТеперь в psql shell сделайте drop table CTRL+SHIFT+V и все готово.Я знаю, что это слишком конкретно, я просто хотел поделиться.:)

12 голосов
/ 27 июля 2016

Я использовал это.

echo "select 'drop table '||tablename||';' from pg_tables where tablename like 'name%'" | \
    psql -U postgres -d dbname -t | \
    psql -U postgres -d dbname
9 голосов
/ 17 ноября 2010

Мне всегда было удобнее создавать сценарий sql, который я могу просмотреть и протестировать перед тем, как запустить его, чем полагаться на правильную настройку plpgsql, чтобы он не уничтожил мою базу данных.Что-то простое в bash, которое выбирает имена таблиц из каталога, а затем создает для меня операторы drop.Таким образом, для 8.4.x вы получите следующий базовый запрос:

SELECT 'drop table '||n.nspname ||'.'|| c.relname||';' as "Name" 
FROM pg_catalog.pg_class c
     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r','v','S','')
     AND n.nspname <> 'pg_catalog'
     AND n.nspname <> 'information_schema'
     AND n.nspname !~ '^pg_toast'
AND pg_catalog.pg_table_is_visible(c.oid);

К которому вы можете добавить предложение where.(где c.relname ilike 'bubba%')

Вывод выглядит следующим образом:

         Name          
-----------------------
 drop table public.a1;
 drop table public.a2;

Итак, сохраните его в файле .sql и запустите с помощью psql -f filename.sql

7 голосов
/ 29 мая 2013

Раскрытие: этот ответ предназначен для пользователей Linux.

Я бы добавил несколько более конкретных инструкций к тому, что сказал @prongs:

  • \dt может поддерживать символы подстановки:можно запустить \dt myPrefix*, например, чтобы выбрать только те таблицы, которые вы хотите удалить;
  • после CTRL-SHIFT-DRAG, чтобы выбрать, затем CTRL-SHIFT-C для копирования текста;
  • в vim,перейдите к INSERT MODE и вставьте таблицы с помощью CTRL-SHIFT-V;
  • нажмите ESC, затем запустите :%s/[ ]*\n/, /g, чтобы перевести его в список через запятую, затем вы можете вставить его (исключая последнюю запятую)в DROP TABLE % CASCADE.
2 голосов
/ 21 октября 2014

Используя инструменты командной строки linux, это можно сделать следующим образом:

psql -d mydb -P tuples_only=1 -c '\dt' | cut -d '|' -f 2 | paste -sd "," | sed 's/ //g' | xargs -I{} echo psql -d mydb -c "drop table {};"

ПРИМЕЧАНИЕ: последнее эхо есть, потому что я не смог найти способ поместить кавычки вокруг команды сброса, поэтому вам нужно скопировать и вставить выходные данные и добавить кавычки самостоятельно.

Если кто-то сможет исправить эту незначительную проблему, это будет потрясающий соус.

1 голос
/ 02 сентября 2015

Итак, я столкнулся с этой проблемой сегодня.Я загрузил свой сервер базы данных через pgadmin3 и сделал это таким образом.Таблицы отсортированы в алфавитном порядке, поэтому смещение и нажатие, а затем удаление работают хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...