Как удалить все таблицы в 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;
запросы, которые я просто копирую и вставляю в консоль. Хотя вы можете добавить некоторый код для их автоматического выполнения, я предпочитаю запускать их самостоятельно.