Подтвердить что ты не робот

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

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

Однако

DROP TABLE tablename*

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

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

4b9b3361

Ответ 1

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

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');

Ответ 2

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

Ответ 3

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

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%.

Ответ 4

Я всегда чувствовал себя намного удобнее, создавая сценарий 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

Ответ 5

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

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

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

Ответ 6

Используя инструменты командной строки 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, поэтому вам нужно скопировать и вставить результат и добавить сами кавычки.

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

Ответ 7

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