Query PostgreSQL per elencare tutti i nomi delle tabelle?


184

È disponibile una query per elencare tutte le tabelle nel mio DB Postgres.

Ho provato una query come:

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

Ma questa query restituisce anche visualizzazioni.

Come posso ottenere solo i nomi delle tabelle, non le viste?

Risposte:


307

Che cos'è questa query (basata sulla descrizione dal manuale )?

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

4
questa è la migliore risposta qui.
Tommy,

3
Che cos'è un tipo di tabella?
Bryan Bryce,

table_type dal manuale: Tipo di tabella: TABELLA DI BASE per una tabella di base persistente (il tipo di tabella normale), VISUALIZZA per una vista, ESTERO per una tabella esterna o TEMPORANEO LOCALE per una tabella temporanea
tzachs

38

Se si desidera un elenco di database

SELECT datname FROM pg_database WHERE datistemplate = false;

Se si desidera un elenco di tabelle dall'installazione pg corrente di tutti i database

SELECT table_schema,table_name FROM information_schema.tables
ORDER BY table_schema,table_name;

Almeno in Postgres 9.5, non è vero. Ho 3 database in un cluster, e questo restituisce solo tabelle dal database corrente.
sudo,

La documentazione dice solo quella attuale: postgresql.org/docs/9.5/static/infoschema-tables.html "table_catalog sql_identifier Nome del database che contiene la tabella (sempre il database corrente)"
sudo,

28

Apri il terminale Postgres con il database che desideri:

psql dbname (run this line in a terminal)

quindi, esegui questo comando nell'ambiente postgres

\d

Questo descriverà tutte le tabelle per nome. Fondamentalmente un elenco di tabelle per nome crescente.

Quindi puoi provare questo per descrivere una tabella per campi:

\d tablename.

Spero che questo ti aiuti.


@wingedpanther come? ci sono \dun'opzione per elencare solo tutte le tabelle, senza indice, senza seq, ...?
Peter Krauss,

5
Non \dtc'è per questo?
Thor

11

Prova questo:

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

questo funziona!


Non penso che ne abbiamo bisogno table_type='BASE TABLE'. Forse mi sbaglio, potresti per favore elaborare?
abriggs

a volte è utile filtrare l'aggiunta del DB attualmente connesso: e 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_tablespotrebbe non essere popolato se track_activitiesdisabilitato. L'uso dell'API "ufficiale" come pg_tableso information_schema.tableè una scelta molto migliore.
a_horse_with_no_name,


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

Per MySQL è necessario table_schema = 'dbName' e per MSSQL rimuovere tale condizione.

Si noti che "solo quelle tabelle e viste sono mostrate a cui l'utente corrente ha accesso". Inoltre, se hai accesso a molti database e desideri limitare il risultato a un determinato database, puoi ottenerlo aggiungendo la condizione AND table_catalog = 'yourDatabase' (in PostgreSQL).

Se desideri anche eliminare l'intestazione che mostra i nomi delle righe e il piè di pagina che mostra il conteggio delle righe, puoi avviare psql con l'opzione da riga di comando -t (abbreviazione di --tuples-only) oppure puoi attivare o disattivare l'impostazione in psql riga di comando di \ t (abbreviazione di \ pset tuples_only). Ciò potrebbe essere utile ad esempio quando si esegue il piping dell'output a un altro comando con \ g [| comando].

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.