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?

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

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;

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.


@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!


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'

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.