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?
sql
postgresql
Tom Feiner
źródło
źródło
|| ' CASCADE ';
i jest idealnyOto kolejna hakerska odpowiedź na ten problem. Działa w
ubuntu
i może też w innych systemach operacyjnych. wykonaj\dt
w wierszu poleceń postgres (wiersz polecenia działałgenome-terminal
w moim przypadku). Wtedy zobaczysz wiele tabel w terminalu. Teraz użyjctrl+click-drag
funkcjonalności,genome-terminal
aby skopiować nazwy wszystkich tabel. Otwó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 adrop table CTRL+SHIFT+V
i gotowe. Wiem, że jest zbyt szczegółowy, po prostu chciałem się nim podzielić. :)źródło
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.\e
, skopiuj listę i wstaw przecinki.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
dbname
iname%
.źródło
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
źródło
drop table
polecenie dla wszelkich znalezionych sekwencji (relkind = 'S'
).drop table
w sekwencji zakończy się niepowodzeniem. Zamiast tego usuń'S'
zrelkind IN
klauzuli. Jeśli chcesz porzucić sekwencje,select 'drop sequence'
c.relkind = 'S'
Ujawnienie: ta odpowiedź jest przeznaczona dla użytkowników Linuksa.
Dodałbym bardziej szczegółowe instrukcje do tego, co powiedział @prongs:
\dt
może obsługiwać symbole wieloznaczne: możesz więc uruchomić\dt myPrefix*
na przykład, aby wybrać tylko te tabele, które chcesz usunąć;CTRL-SHIFT-DRAG
aby wybrać, a następnieCTRL-SHIFT-C
skopiować tekst;vim
, przejdź doINSERT MODE
i wklej tabele za pomocąCTRL-SHIFT-V
;ESC
, a następnie uruchom,:%s/[ ]*\n/, /g
aby przetłumaczyć go na listę oddzieloną przecinkami, a następnie możesz go wkleić (z wyłączeniem ostatniego przecinka)DROP TABLE % CASCADE
.źródło
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.
źródło
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ń.
źródło