Как удалить все таблицы в psql (интерактивный терминал PostgreSQL), который начинается с общего слова? - PullRequest
2 голосов
/ 15 марта 2012

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

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

Ответы [ 2 ]

6 голосов
/ 15 марта 2012

Этот скрипт будет генерировать команды 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-кода и добавляет имя схемы там, где это необходимо. Подробнее о типах идентификаторов объектов в руководстве .

О пути поиска схемы.

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

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

5 голосов
/ 15 марта 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...