Requête PostgreSQL pour lister tous les noms de table?

184

Existe-t-il une requête disponible pour répertorier toutes les tables de ma base de données Postgres.

J'ai essayé une requête comme:

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

Mais cette requête renvoie également des vues.

Comment puis-je obtenir uniquement les noms de table, pas les vues?

jobi88
la source

Réponses:

307

Qu'en est-il de cette requête (basée sur la description du manuel )?

SELECT table_name
  FROM information_schema.tables
 WHERE table_schema='public'
   AND table_type='BASE TABLE';
vyegorov
la source
4
c'est la meilleure réponse ici.
Tommy
3
Qu'est-ce qu'un type de table?
Bryan Bryce
table_type du manuel: Type de la table: BASE TABLE pour une table de base persistante (le type de table normal), VIEW pour une vue, FOREIGN pour une table étrangère ou LOCAL TEMPORARY pour une table temporaire
tzachs
38

Si vous voulez une liste de base de données

SELECT datname FROM pg_database WHERE datistemplate = false;

Si vous voulez une liste des tables de l'installation pg actuelle de toutes les bases de données

SELECT table_schema,table_name FROM information_schema.tables
ORDER BY table_schema,table_name;
Dur
la source
Au moins dans Postgres 9.5, ce n'est pas vrai. J'ai 3 bases de données dans un cluster, et cela ne renvoie que des tables de la base de données actuelle.
sudo
La documentation ne dit que l'actuelle: postgresql.org/docs/9.5/static/infoschema-tables.html "table_catalog sql_identifier Nom de la base de données qui contient la table (toujours la base de données courante)"
sudo
28

Ouvrez le terminal postgres avec la base de données que vous souhaitez:

psql dbname (run this line in a terminal)

puis exécutez cette commande dans l'environnement postgres

\d

Cela décrira toutes les tables par leur nom. Fondamentalement, une liste de tables par nom croissant.

Ensuite, vous pouvez essayer ceci pour décrire une table par champs:

\d tablename.

J'espère que cela t'aides.

Ty_
la source
@wingedpanther comment faire? il existe une \doption pour ne lister que toutes les tables, sans index, sans seq, ...?
Peter Krauss
5
N'est-ce \dtpas là pour ça?
thoroc
11

Essaye ça:

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

celui-ci fonctionne!

TS
la source
Je ne pense pas que nous en ayons besoin table_type='BASE TABLE'. Peut-être que je me trompe, pourriez-vous préciser?
abriggs
Parfois, il est utile de filtrer la base de données connectée actuelle en ajoutant: et 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.
la source
1
pg_stat_user_tablespeut ne pas être renseigné si track_activitiesest désactivé. Utiliser l'API "officielle" telle que pg_tablesou information_schema.tableest un bien meilleur choix.
a_horse_with_no_name
0
SELECT table_name
FROM information_schema.tables
WHERE table_type='BASE TABLE'
AND table_schema='public';

Pour MySQL, vous auriez besoin de table_schema = 'dbName' et pour MSSQL supprimez cette condition.

Notez que "seules les tables et vues auxquelles l'utilisateur actuel a accès sont affichées". De plus, si vous avez accès à de nombreuses bases de données et que vous souhaitez limiter le résultat à une certaine base de données, vous pouvez y parvenir en ajoutant la condition AND table_catalog = 'yourDatabase' (dans PostgreSQL).

Si vous souhaitez également vous débarrasser de l'en-tête affichant les noms de ligne et le pied de page affichant le nombre de lignes, vous pouvez soit démarrer le psql avec l'option de ligne de commande -t (abréviation de --tuples-only), soit basculer le paramètre dans psql. ligne de commande par \ t (abréviation de \ pset tuples_only). Cela peut être utile, par exemple, lors du transfert de la sortie vers une autre commande avec \ g [| commande].

Kashif
la source