Zapytanie PostgreSQL z listą wszystkich nazw tabel?

184

Czy jest dostępne zapytanie, aby wyświetlić wszystkie tabele w mojej bazie danych Postgres.

Wypróbowałem jedno zapytanie, takie jak:

SELECT table_name FROM information_schema.tables
                      WHERE table_schema='public' 

Ale to zapytanie zwraca również widoki.

Jak mogę uzyskać tylko nazwy tabel, a nie widoki?

jobi88
źródło

Odpowiedzi:

307

Co o tym zapytaniu (na podstawie opisu z instrukcji )?

SELECT table_name
  FROM information_schema.tables
 WHERE table_schema='public'
   AND table_type='BASE TABLE';
Wiegorow
źródło
4
to najlepsza odpowiedź tutaj.
Tommy
3
Co to jest typ stołu?
Bryan Bryce,
table_type z instrukcji: Typ tabeli: BASE TABLE dla trwałej tabeli podstawowej (normalny typ tabeli), VIEW dla widoku, FOREIGN dla tabeli obcej lub LOCAL TEMPORARY dla tabeli tymczasowej
tzachs
38

Jeśli chcesz listę baz danych

SELECT datname FROM pg_database WHERE datistemplate = false;

Jeśli chcesz listę tabel z bieżącej instalacji pg wszystkich baz danych

SELECT table_schema,table_name FROM information_schema.tables
ORDER BY table_schema,table_name;
Szorstki
źródło
Przynajmniej w Postgresie 9.5, to nieprawda. Mam 3 bazy danych w jednym klastrze, a to zwraca tylko tabele z bieżącej bazy danych.
sudo
Dokumentacja mówi tylko bieżąca: postgresql.org/docs/9.5/static/infoschema-tables.html „katalog_katalogu identyfikator_sql nazwa bazy danych zawierającej tabelę (zawsze bieżąca baza danych)”
sudo
28

Otwórz terminal Postgres z bazą danych, którą chcesz:

psql dbname (run this line in a terminal)

następnie uruchom to polecenie w środowisku postgres

\d

Spowoduje to opisanie wszystkich tabel według nazwy. Zasadniczo lista tabel według nazwy rosnąco.

Następnie możesz spróbować opisać tabelę według pól:

\d tablename.

Mam nadzieję że to pomoże.

Ty_
źródło
@wingedpanther jak to zrobić? istnieje \dopcja, aby wyświetlić tylko wszystkie tabele, bez indeksu, bez sekwencji, ...?
Peter Krauss,
5
Czy \dtnie ma po to?
toroc
11

Spróbuj tego:

SELECT table_name 
FROM information_schema.tables 
WHERE table_schema='public' AND table_type='BASE TABLE'

ten działa!

TS
źródło
Nie sądzę, że potrzebujemy table_type='BASE TABLE'. Być może się mylę, proszę o rozwinięcie?
abriggs
czasem przydatne jest filtrowanie podłączonego obecnie DB dodawanie: i table_catalog = current_database ()
Diego Scaravaggi
8
select 
 relname as table 
from 
 pg_stat_user_tables 
where schemaname = 'public'

select 
  tablename as table 
from 
  pg_tables  
where schemaname = 'public'
Vivek S.
źródło
1
pg_stat_user_tablesmoże nie zostać wypełniony, jeśli track_activitiesjest wyłączony. Korzystanie z „oficjalnego” interfejsu API, takiego jak pg_tableslub, information_schema.tablejest znacznie lepszym wyborem.
a_horse_w_no_name
0
SELECT table_name
FROM information_schema.tables
WHERE table_type='BASE TABLE'
AND table_schema='public';

W przypadku MySQL potrzebujesz table_schema = 'dbName', a dla MSSQL usuń ten warunek.

Zauważ, że „pokazane są tylko te tabele i widoki, do których bieżący użytkownik ma dostęp”. Ponadto, jeśli masz dostęp do wielu baz danych i chcesz ograniczyć wynik do określonej bazy danych, możesz to osiągnąć, dodając warunek ORAZ table_catalog = 'twoja baza danych' (w PostgreSQL).

Jeśli chcesz również pozbyć się nagłówka zawierającego nazwy wierszy i stopkę pokazującą liczbę wierszy, możesz albo uruchomić psql z opcją wiersza poleceń -t (skrót tylko --tuples-only), albo możesz zmienić ustawienie w psql's wiersz poleceń przez \ t (skrót od \ pset tuples_only). Może to być przydatne na przykład podczas przesyłania danych wyjściowych do innego polecenia za pomocą \ g [| polecenie].

Kashif
źródło