Как удалить несколько таблиц в PostgreSQL с помощью шаблона
При работе с разделами часто бывает необходимо удалить все разделы сразу.
Однако
DROP TABLE tablename*
Не работает. (Подстановочный знак не соблюдается).
Есть ли элегантный (читаемый: легко запоминающийся) способ отбросить несколько таблиц в одной команде с помощью подстановочного знака?
Ответы
Ответ 1
Используйте список, разделенный запятыми:
DROP TABLE foo, bar, baz;
Если вам действительно нужна нога, этот будет выполнять эту работу:
CREATE OR REPLACE FUNCTION footgun(IN _schema TEXT, IN _parttionbase TEXT)
RETURNS void
LANGUAGE plpgsql
AS
$$
DECLARE
row record;
BEGIN
FOR row IN
SELECT
table_schema,
table_name
FROM
information_schema.tables
WHERE
table_type = 'BASE TABLE'
AND
table_schema = _schema
AND
table_name ILIKE (_parttionbase || '%')
LOOP
EXECUTE 'DROP TABLE ' || quote_ident(row.table_schema) || '.' || quote_ident(row.table_name);
RAISE INFO 'Dropped table: %', quote_ident(row.table_schema) || '.' || quote_ident(row.table_name);
END LOOP;
END;
$$;
SELECT footgun('public', 'tablename');
Ответ 2
Вот еще один хакерский ответ на эту проблему. Он работает в ubuntu
и, возможно, в некоторых других os тоже. выполните \dt
в командной строке postgres (в моем случае в командной строке genome-terminal
). Затем вы увидите много таблиц в терминале. Теперь используйте ctrl+click-drag
функциональность genome-terminal
для копирования имен всех таблиц.
Откройте python, выполните некоторую строковую обработку (замените '' на '', а затем '\n' на ','), и вы получите список всех таблиц, разделенных запятыми. Теперь в psql shell сделайте drop table CTRL+SHIFT+V
, и все готово. Я знаю, что это слишком специфично, я просто хотел поделиться.:)
Ответ 3
Я использовал это.
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%
.
Ответ 4
Я всегда чувствовал себя намного удобнее, создавая сценарий 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
Ответ 5
Раскрытие: этот ответ предназначен для пользователей Linux.
Я бы добавил несколько конкретных инструкций к тому, что сказал @prongs:
-
\dt
может поддерживать подстановочные знаки: поэтому вы можете запускать \dt myPrefix*
, например, для выбора только тех таблиц, которые вы хотите удалить,
- после
CTRL-SHIFT-DRAG
, чтобы выбрать CTRL-SHIFT-C
, чтобы скопировать текст;
- в
vim
, перейдите к INSERT MODE
и вставьте таблицы с помощью CTRL-SHIFT-V
;
- нажмите
ESC
, затем запустите :%s/[ ]*\n/, /g
, чтобы перевести его в список, разделенный запятыми, затем вы можете вставить его (за исключением последней запятой) в DROP TABLE % CASCADE
.
Ответ 6
Используя инструменты командной строки 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, поэтому вам нужно скопировать и вставить результат и добавить сами кавычки.
Если кто-то может исправить эту незначительную проблему, это будет потрясающий соус.
Ответ 7
Итак, сегодня я столкнулся с этой проблемой. Я загрузил свой сервер db через pgadmin3 и сделал это именно так. Таблицы сортируются в алфавитном порядке, поэтому сдвиг и щелчок, за которым следует удаление, хорошо работают.