PostgreSQL-Abfrage zum Auflisten aller Tabellennamen?


183

Gibt es eine Abfrage, um alle Tabellen in meiner Postgres-Datenbank aufzulisten?

Ich habe eine Abfrage ausprobiert wie:

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

Diese Abfrage gibt jedoch auch Ansichten zurück.

Wie kann ich nur Tabellennamen erhalten, keine Ansichten?

Antworten:


307

Was ist mit dieser Abfrage (basierend auf der Beschreibung aus dem Handbuch )?

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

4
Dies ist die beste Antwort hier.
Tommy

3
Was ist ein Tabellentyp?
Bryan Bryce

table_type aus dem Handbuch: Typ der Tabelle: BASE TABLE für eine persistente Basistabelle (der normale Tabellentyp), VIEW für eine Ansicht, FOREIGN für eine fremde Tabelle oder LOCAL TEMPORARY für eine temporäre Tabelle
tzachs

37

Wenn Sie eine Liste der Datenbank möchten

SELECT datname FROM pg_database WHERE datistemplate = false;

Wenn Sie eine Liste der Tabellen aus der aktuellen pg-Installation aller Datenbanken wünschen

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

Zumindest in Postgres 9.5 stimmt das nicht. Ich habe 3 Datenbanken in einem Cluster, und dies gibt nur Tabellen aus der aktuellen Datenbank zurück.
Sudo

Die Dokumentation sagt nur die aktuelle: postgresql.org/docs/9.5/static/infoschema-tables.html "table_catalog sql_identifier Name der Datenbank, die die Tabelle enthält (immer die aktuelle Datenbank)"
sudo

27

Öffnen Sie das Postgres-Terminal mit der gewünschten Datenbank:

psql dbname (run this line in a terminal)

Führen Sie diesen Befehl dann in der Postgres-Umgebung aus

\d

Dies beschreibt alle Tabellen nach Namen. Grundsätzlich eine Liste von Tabellen nach Namen aufsteigend.

Dann können Sie versuchen, eine Tabelle durch Felder zu beschreiben:

\d tablename.

Hoffe das hilft.


@wingedpanther wie geht das? Es gibt eine \dOption, um nur alle Tabellen aufzulisten, ohne Index, ohne Sequenz, ...?
Peter Krauss

5
Gibt \dtes dafür nicht?
Thoroc

11

Versuche dies:

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

Dieser funktioniert!


Ich glaube nicht, dass wir brauchen table_type='BASE TABLE'. Vielleicht irre ich mich, könnten Sie bitte näher darauf eingehen?
Abriggs

Manchmal ist es nützlich, die aktuell verbundene Datenbank zu
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_tableswird möglicherweise nicht ausgefüllt, wenn track_activitiesdeaktiviert ist. Die Verwendung der "offiziellen" API wie pg_tablesoder information_schema.tableist eine viel bessere Wahl.
a_horse_with_no_name


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

Für MySQL benötigen Sie table_schema = 'dbName' und für MSSQL entfernen Sie diese Bedingung.

Beachten Sie, dass "nur die Tabellen und Ansichten angezeigt werden, auf die der aktuelle Benutzer Zugriff hat". Wenn Sie Zugriff auf viele Datenbanken haben und das Ergebnis auf eine bestimmte Datenbank beschränken möchten, können Sie dies erreichen, indem Sie die Bedingung AND table_catalog = 'yourDatabase' (in PostgreSQL) hinzufügen.

Wenn Sie auch die Kopfzeile mit den Zeilennamen und die Fußzeile mit der Zeilenanzahl entfernen möchten, können Sie psql entweder mit der Befehlszeilenoption -t (kurz für --tuples-only) starten oder die Einstellung in psql umschalten Befehlszeile von \ t (kurz für \ pset tuples_only). Dies kann beispielsweise nützlich sein, wenn die Ausgabe mit \ g [| Befehl] an einen anderen Befehl weitergeleitet wird.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.