2012-03-15 1 views
2

Как отбросить все таблицы, чье имя начинается с, скажем, doors_? Можно ли сделать какое-то регулярное выражение с помощью команды drop table?Как удалить все таблицы в psql (интерактивный терминал PostgreSQL), который начинается с общего слова?

Я предпочитаю не писать собственный скрипт, но все решения приветствуются. Благодаря!

ответ

6

Этот сценарий будет генерировать DDL команды отказаться от них всех:

SELECT 'DROP TABLE ' || t.oid::regclass || ';' 
FROM pg_class t 
-- JOIN pg_namespace n ON n.oid = t.relnamespace -- to select by schema 
WHERE t.relkind = 'r' 
AND t.relname ~~ E'doors\_%' -- enter search term for table here 
-- AND n.nspname ~~ '%myschema%' -- optionally select by schema(s), too 
ORDER BY 1; 

Актерский t.oid::regclass делает синтаксическую работу для смешанных идентификаторов случаев, зарезервированные слов или специальных символов в именах таблиц, тоже. Он также предотвращает внедрение SQL и при необходимости добавляет имя схемы. Подробнее о object identifier types in the manual.

About the schema search path.

Вы можете автоматизировать капания, тоже, но это неразумно не проверить то, что вы на самом деле удалить, прежде чем делать.

Вы можете добавить CASCADE к каждому утверждению для объектов, зависящих от DROP (представления и ссылки на внешние ключи). Но, опять же, это неразумный, если вы не очень хорошо знаете, что делаете. Ограничения внешнего ключа не являются большими потерями, но это также полностью отключит все зависимые взгляды. Без CASCADE вы получаете сообщения об ошибках, сообщающие вам, какие объекты не позволяют вам отбрасывать таблицу. И тогда вы сможете справиться с этим.

5

Обычно я использую один запрос для генерации команд DDL для меня на основе некоторых таблиц метаданных, а затем запускаю эти команды вручную. Например:

SELECT 'DROP TABLE ' || tablename || ';' FROM pg_tables 
WHERE tablename LIKE 'prefix%' AND schemaname = 'public'; 

Это вернет кучу DROP TABLE xxx; запросов, которые я просто скопировать & пасты на консоль. Хотя вы можете добавить код для их автоматического запуска, я предпочитаю запускать их самостоятельно.

+0

Это загруженный лап. Если вы не присваиваете схему именам таблиц, вы можете потерять неверную таблицу - в зависимости от вашего 'search_path'. (Среди других проблем с этим.) Используйте это только в том случае, если вы знаете, что делаете! –

+0

Вы когда-нибудь запускали команды 'DROP TABLE', не зная, что вы делаете? –

+0

Никогда. Вы абсолютно правы. То, что вам может не хватать: даже если вы сузите поиск по одной схеме, как и в вашем ответе, схема может не находиться в текущем 'search_path' или другая схема может на первом месте и содержать таблицу с тем же именем. Вы можете удалить ** неправильный ** стол и никогда не знать этого, пока не стало слишком поздно. Вот почему я называю это загруженным ножом. –

Смежные вопросы