Як скинути кілька таблиць у PostgreSQL, використовуючи підстановочний знак


84

При роботі з розділами часто виникає потреба видалити всі розділи одночасно.

Однак

DROP TABLE tablename*

Не працює. (Узагальнюючий знак не поважається).

Чи існує елегантний (читай: легко запам’ятовується) спосіб скинути кілька таблиць в одній команді за допомогою підстановочного символу?

Відповіді:


117

Використовуйте список, відокремлений комами:

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');

3
Дякуємо за відповідь! Список, відокремлений комами, чудово підходить для видалення невеликого списку таблиць. Однак це не практично для скидання 20 таблиць одночасно (або більше). Я перефокусую це питання, щоб бути яснішим.
Том Фейнер

2
На жаль, це єдиний варіант, який у вас є. Ви можете створити для цього збережену функцію, але є велика ймовірність, що ви застрелите собі ногу: кинувши занадто багато таблиць ...
Френк Хейкенс,

4
Функція додана, отримуйте задоволення! І будьте обережні, це може знищити всю вашу базу даних.
Френк Хейкенс,

просто не вистачає a, || ' CASCADE ';і це ідеально
MFARID

28

Ось ще одна шалена відповідь на цю проблему. Це працює ubuntuі, можливо, ще в деяких ОС. виконайте \dtкомандний рядок in postgres ( genome-terminalу моєму випадку командний рядок працював всередині ). Тоді ви побачите багато таблиць у терміналі. Тепер скористайтеся ctrl+click-dragфункціональністю, genome-terminalщоб скопіювати імена всіх таблиць. введіть тут опис зображенняВідкрийте python, виконайте деяку обробку рядків (замініть '' на '', а потім '\ n' на ','), і ви отримаєте список усіх таблиць, розділених комами. Тепер у оболонці psql зробіть a, drop table CTRL+SHIFT+Vі все готово. Я знаю, що це занадто конкретно, я просто хотів поділитися з ним. :)


Це чудово працює, це дозволяє легко чітко визначити, що ви хочете зробити.
Бред Кох,

5
Те, що я роблю, аналогічно, я пишу: DROP TABLE whatever_а потім натискаю TAB, копіюю всі таблиці в буфер обміну, відкриваю піднесене, знаходжу / замінюю і замінюю за допомогою регулярних виразів, \s+для ,та вставляю на термінал.
Альфонсо Перес

так це це для 5 до багатьох таблиць. для довгого списку запустіть запит до назв таблиць, викиньте з psql у ваш редактор за допомогою \e, скопіюйте у свій список і розставте коми.
Мерлін,

Крім того, у pgadmin3, якщо ви виберете назву схеми, а потім перейдете на вкладку "Залежні", ви зможете виділити всі таблиці (за допомогою клавіші Shift), а потім скопіювати їх усі за допомогою CTRL + C. Потім за допомогою текстового редактора сформуйте DROP TABLE [ ім'я, ..] запит.
Mate Šimović

18

Я цим користувався.

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%.


14

Мені завжди було набагато зручніше створювати скрипт 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


Надалі, якщо ви помістите всі таблиці, які потрібно видалити, в одну і ту ж схему, ви можете скинути її за допомогою каскаду: drop schema abc cascade;
Скотт Марлоу

Зверніть увагу, що цей запит також створить drop tableкоманду для будь-яких знайдених послідовностей ( relkind = 'S'). drop tableна послідовність не вдасться. Натомість вилучіть 'S'із relkind INречення. Якщо вам потрібно скинути послідовності, select 'drop sequence'c.relkind = 'S'
побудуйте

9

Розкриття інформації: ця відповідь призначена для користувачів Linux.

Я б додав кілька більш конкретних інструкцій до того, що сказав @prongs:

  • \dtможе підтримувати узагальнюючі символи: так що ви можете запустити, \dt myPrefix*наприклад, щоб вибрати лише таблиці, які потрібно скинути;
  • після CTRL-SHIFT-DRAGвибрати, потім CTRL-SHIFT-Cскопіювати текст;
  • у vim, перейдіть INSERT MODEі вставте таблиці з CTRL-SHIFT-V;
  • натисніть ESC, а потім запустіть, :%s/[ ]*\n/, /gщоб перекласти його в список, відокремлений комами, після чого ви можете вставити його (за винятком останньої коми) в DROP TABLE % CASCADE.

3

За допомогою інструментів командного рядка 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, тому вам потрібно скопіювати та вставити вихідні дані та додати лапки самостійно.

Якщо хтось може вирішити цю незначну проблему, це був би чудовий соус.


1

Тож я зіткнувся з цією проблемою сьогодні. Я завантажив свій сервер db через pgadmin3 і зробив це таким чином. Таблиці відсортовані за алфавітом, тому зручно працює зрушення та клацання з подальшим видаленням.


Ви можете це зробити, але вам доведеться скористатися вікном "Властивості"
Метт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.