Как удалить несколько таблиц в PostgreSQL с помощью подстановочного знака

84

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

тем не мение

DROP TABLE tablename*

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

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

Том Фейнер
источник

Ответы:

117

Используйте список, разделенный запятыми:

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');
Фрэнк Хайкенс
источник
3
Спасибо за ответы! Список, разделенный запятыми, отлично подходит для удаления небольшого списка таблиц. Однако нецелесообразно отбрасывать сразу 20 таблиц (или больше). Я перефокусирую вопрос, чтобы было понятнее.
Tom Feiner
2
Извините, это единственный вариант, который у вас есть. Вы можете создать для этого сохраненную функцию, но есть большая вероятность, что вы выстрелите себе в ногу: сбросив слишком много столов ...
Фрэнк Хейкенс
4
Функция добавлена, получайте удовольствие! И будьте осторожны, это может уничтожить всю вашу базу данных.
Фрэнк Хайкенс
просто отсутствует, || ' CASCADE ';и он идеален
MFARID
28

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

зубцы
источник
Это отлично работает, это позволяет вам легко четко указать, что вы хотите сделать.
Брэд Кох
5
Я делаю то же самое, я пишу: DROP TABLE whatever_а затем нажимаю TAB, копирую все таблицы в буфер обмена, открываю возвышенное, находю / заменяю и заменяю с помощью регулярных выражений \s+для ,и вставляю на терминал.
Альфонсо Перес
да, это от 5 до многих столов. для длинного списка запустите запрос имен таблиц, выкиньте из psql в редактор \e, скопируйте в свой список и поместите запятые.
Мерлин
Кроме того, в pgadmin3, если вы выберете имя схемы, а затем перейдете на вкладку «Зависимые», вы можете выбрать все таблицы (с помощью клавиши Shift), а затем скопировать их все, используя CTRL + C. Затем используйте какой-нибудь текстовый редактор, чтобы сформировать DROP TABLE [ имя, ..] запрос.
Мате Шимович
18

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

echo "select 'drop table '||tablename||';' from pg_tables where tablename like 'name%'" | \
    psql -U postgres -d dbname -t | \
    psql -U postgres -d dbname

Подставьте соответствующие значения для dbnameи name%.

Isaaclw
источник
14

Мне всегда было удобнее создавать 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. ( where c.relname ilike 'bubba%')

Результат выглядит так:

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

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

Скотт Марлоу
источник
Как следствие, если вы поместите все таблицы, которые нужно удалить, в одну схему, вы можете удалить ее с помощью cascade: drop schema abc cascade;
Скотт Марлоу
Обратите внимание, что этот запрос также создаст drop tableкоманду для любых найденных им последовательностей ( relkind = 'S'). drop tableпо последовательности не удастся. Вместо этого удалите 'S'из relkind INпункта. Если вам нужно отбросить последовательности, select 'drop sequence'c.relkind = 'S'
создайте
9

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

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

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

Используя инструменты командной строки 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 {};"

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

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

Джон
источник
1

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

Бен
источник
Вы можете это сделать, но вы должны использовать окно «Свойства»
Мэтт,