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


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

DROP TABLE tablename*

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

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

7 59

7 ответов:

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

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

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

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

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

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

вывод выглядит это:

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

Итак, сохраните это в a .sql-файл и запустите его с именем файла psql-F.sql

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

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

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

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

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

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