Jak usunąć wiele tabel w PostgreSQL za pomocą symbolu wieloznacznego

84

Podczas pracy z partycjami często istnieje potrzeba usunięcia wszystkich partycji naraz.

jednak

DROP TABLE tablename*

Nie działa. (Symbol wieloznaczny nie jest przestrzegany).

Czy istnieje elegancki (czytaj: łatwy do zapamiętania) sposób usunięcia wielu tabel w jednym poleceniu z użyciem symbolu wieloznacznego?

Tom Feiner
źródło

Odpowiedzi:

117

Użyj listy oddzielonej przecinkami:

DROP TABLE foo, bar, baz;

Jeśli naprawdę potrzebujesz pistoletu nożnego, ten spełni swoje zadanie:

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');
Frank Heikens
źródło
3
Dzięki za odpowiedź! Lista oddzielona przecinkami świetnie nadaje się do usuwania małej listy tabel. Jednak upuszczanie 20 stołów na raz (lub więcej) nie jest praktyczne. Ponownie skupię się na pytaniu, aby było jaśniejsze.
Tom Feiner,
2
Przepraszamy, to jedyna dostępna opcja. Mógłbyś skonstruować do tego zapisaną funkcję, ale jest duża szansa, że
strzelisz
4
Dodano funkcję, baw się dobrze! I bądź ostrożny, ten może zniszczyć całą twoją bazę danych.
Frank Heikens
po prostu brakuje || ' CASCADE ';i jest idealny
MFARID
28

Oto kolejna hakerska odpowiedź na ten problem. Działa w ubuntui może też w innych systemach operacyjnych. wykonaj \dtw wierszu poleceń postgres (wiersz polecenia działał genome-terminalw moim przypadku). Wtedy zobaczysz wiele tabel w terminalu. Teraz użyj ctrl+click-dragfunkcjonalności, genome-terminalaby skopiować nazwy wszystkich tabel. wprowadź opis obrazu tutajOtwórz Pythona, przeprowadź obróbkę łańcuchów (zamień „” na „”, a następnie „\ n” na „,”), a otrzymasz listę wszystkich tabel oddzielonych przecinkami. Teraz w powłoce psql wykonaj a drop table CTRL+SHIFT+Vi gotowe. Wiem, że jest zbyt szczegółowy, po prostu chciałem się nim podzielić. :)

zęby
źródło
To działa świetnie, umożliwia łatwe określenie tego, co chcesz zrobić.
Brad Koch
5
Robię podobnie, piszę: DROP TABLE whatever_następnie wciskam TAB, kopiuję wszystkie tabele do schowka, otwieram sublime, znajdź / zamień i zamień używając wyrażeń regularnych, \s+for ,i wklej na terminalu.
Alfonso Pérez,
tak, to jest od 5 do wielu stołów. dla długiej listy uruchom zapytanie o nazwy tabel, wyrzuć z psql do edytora używając \e, skopiuj listę i wstaw przecinki.
Merlin,
Ponadto w pgadmin3, jeśli wybierzesz nazwę schematu, a następnie przejdziesz do zakładki „Zależne”, możesz zaznaczyć wszystkie tabele (używając klawisza Shift), a następnie skopiować je wszystkie za pomocą CTRL + C. Następnie użyj edytora tekstu, aby utworzyć DROP TABLE [ nazwa, ..] zapytanie.
Mate Šimović
18

Użyłem tego.

echo "select 'drop table '||tablename||';' from pg_tables where tablename like 'name%'" | \
    psql -U postgres -d dbname -t | \
    psql -U postgres -d dbname

Zastąp odpowiednimi wartościami dbnamei name%.

isaaclw
źródło
14

Zawsze czułem się bardziej komfortowo, tworząc skrypt sql, który mogę przejrzeć i przetestować przed jego uruchomieniem, niż polegać na poprawnym ustawieniu pliku plpgsql, aby nie zniszczył mojej bazy danych. Coś prostego w bashu, które wybiera nazwy tabel z katalogu, a następnie tworzy dla mnie instrukcje drop. Więc dla 8.4.x otrzymasz takie podstawowe zapytanie:

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

Do którego możesz dodać klauzulę Where. ( where c.relname ilike 'bubba%')

Wynik wygląda następująco:

         Name          
-----------------------
 drop table public.a1;
 drop table public.a2;

Więc zapisz to w pliku .sql i uruchom go za pomocą psql -f nazwa_pliku.sql

Scott Marlowe
źródło
W ramach kontynuacji, jeśli umieścisz wszystkie tabele, które wymagają usunięcia, w tym samym schemacie, możesz usunąć go za pomocą kaskady: drop schema abc cascade;
Scott Marlowe
Zauważ, że to zapytanie wygeneruje również drop tablepolecenie dla wszelkich znalezionych sekwencji ( relkind = 'S'). drop tablew sekwencji zakończy się niepowodzeniem. Zamiast tego usuń 'S'z relkind INklauzuli. Jeśli chcesz porzucić sekwencje, select 'drop sequence'c.relkind = 'S'
utwórz
9

Ujawnienie: ta odpowiedź jest przeznaczona dla użytkowników Linuksa.

Dodałbym bardziej szczegółowe instrukcje do tego, co powiedział @prongs:

  • \dtmoże obsługiwać symbole wieloznaczne: możesz więc uruchomić \dt myPrefix*na przykład, aby wybrać tylko te tabele, które chcesz usunąć;
  • po, CTRL-SHIFT-DRAGaby wybrać, a następnie CTRL-SHIFT-Cskopiować tekst;
  • in vim, przejdź do INSERT MODEi wklej tabele za pomocą CTRL-SHIFT-V;
  • naciśnij ESC, a następnie uruchom, :%s/[ ]*\n/, /gaby przetłumaczyć go na listę oddzieloną przecinkami, a następnie możesz go wkleić (z wyłączeniem ostatniego przecinka) DROP TABLE % CASCADE.
Campa
źródło
3

Korzystając z narzędzi wiersza poleceń systemu Linux, można to zrobić w następujący sposób:

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 {};"

UWAGA: Ostatnie echo jest tam, ponieważ nie mogłem znaleźć sposobu na umieszczenie cudzysłowów wokół polecenia drop, więc musisz skopiować i wkleić dane wyjściowe i samodzielnie dodać cudzysłowy.

Jeśli ktokolwiek może naprawić ten drobny problem, byłby to niesamowity sos.

Jon
źródło
1

Więc dzisiaj stanąłem przed tym problemem. Załadowałem moją bazę danych serwera przez pgadmin3 i zrobiłem to w ten sposób. Tabele są sortowane alfabetycznie, więc przesuń i kliknij, a następnie usuń.

Ben
źródło
Możesz to zrobić, ale musisz użyć okna „Właściwości”
Matt