При работе с разделами часто возникает необходимость удалить сразу все разделы.
тем не мение
DROP TABLE tablename*
Не работает. (Подстановочный знак не соблюдается).
Есть ли элегантный (читай: легко запоминающийся) способ удалить несколько таблиц в одной команде с подстановочным знаком?
sql
postgresql
Том Фейнер
источник
источник
|| ' CASCADE ';
и он идеаленВот еще один хакерский ответ на эту проблему. Он работает
ubuntu
и, возможно, в некоторых других ОС. выполните\dt
команду в командной строке postgres (genome-terminal
в моем случае командная строка работала внутри ). Тогда вы увидите в терминале множество таблиц. Теперь используйтеctrl+click-drag
функциональность,genome-terminal
чтобы скопировать имена всех таблиц. Откройте python, выполните некоторую обработку строк (замените '' на '', а затем '\ n' на ','), и вы получите список всех таблиц, разделенных запятыми. Теперь в оболочке psql выполните a,drop table CTRL+SHIFT+V
и все готово. Я знаю, что это слишком конкретно, я просто хотел поделиться. :)источник
DROP TABLE whatever_
а затем нажимаю TAB, копирую все таблицы в буфер обмена, открываю возвышенное, находю / заменяю и заменяю с помощью регулярных выражений\s+
для,
и вставляю на терминал.\e
, скопируйте в свой список и поместите запятые.Я использовал это.
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%
.источник
Мне всегда было удобнее создавать 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
источник
drop table
команду для любых найденных им последовательностей (relkind = 'S'
).drop table
по последовательности не удастся. Вместо этого удалите'S'
изrelkind IN
пункта. Если вам нужно отбросить последовательности,select 'drop sequence'
c.relkind = 'S'
Раскрытие информации: этот ответ предназначен для пользователей 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, поэтому вам нужно скопировать и вставить вывод и добавить кавычки самостоятельно.
Если кто-то может исправить эту незначительную проблему, это будет отличный соус.
источник
Итак, я столкнулся с этой проблемой сегодня. Я загрузил свой сервер db через pgadmin3 и так и сделал. Таблицы отсортированы по алфавиту, поэтому сдвиг и щелчок с последующим удалением работают хорошо.
источник