Как удалить несколько таблиц в PostgreSQL с помощью подстановочного знака
при работе с разделами часто возникает необходимость удалить все разделы сразу.
DROP TABLE tablename*
не работает. (Подстановочный знак не соблюдается).
есть ли элегантный (читай: легко запомнить) способ удалить несколько таблиц в одной команде с подстановочным знаком?
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
для копирования имен всех таблиц. откройте 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, поэтому вам нужно скопировать и вставить вывод и добавить кавычки самостоятельно.
Если кто-то может исправить эту незначительную проблему, это будет потрясающий соус.