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

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

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

2 ответа

Решение

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

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

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

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

Другие вопросы по тегам