¿PostgreSQL consulta para enumerar todos los nombres de tabla?

184

¿Hay alguna consulta disponible para enumerar todas las tablas en mi DB de Postgres?

Probé una consulta como:

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

Pero esta consulta también devuelve vistas.

¿Cómo puedo obtener solo nombres de tablas, no vistas?

jobi88
fuente

Respuestas:

307

¿Qué pasa con esta consulta (basada en la descripción del manual )?

SELECT table_name
  FROM information_schema.tables
 WHERE table_schema='public'
   AND table_type='BASE TABLE';
vyegorov
fuente
44
Esta es la mejor respuesta aquí.
Tommy
3
¿Qué es un tipo de tabla?
Bryan Bryce
tipo_tabla del manual: Tipo de tabla: TABLA BASE para una tabla base persistente (el tipo de tabla normal), VER para una vista, EXTRANJERO para una tabla extranjera, o TEMPORAL LOCAL para una tabla temporal
tzachs
38

Si quieres lista de base de datos

SELECT datname FROM pg_database WHERE datistemplate = false;

Si desea una lista de tablas de la instalación actual de páginas de todas las bases de datos

SELECT table_schema,table_name FROM information_schema.tables
ORDER BY table_schema,table_name;
Duro
fuente
Al menos en Postgres 9.5, eso no es cierto. Tengo 3 bases de datos en un clúster, y esto solo devuelve tablas de la base de datos actual.
sudo
La documentación dice solo el actual: postgresql.org/docs/9.5/static/infoschema-tables.html "table_catalog sql_identifier Nombre de la base de datos que contiene la tabla (siempre la base de datos actual)"
sudo
28

Abra el terminal de postgres con la base de datos que desea:

psql dbname (run this line in a terminal)

luego, ejecute este comando en el entorno postgres

\d

Esto describirá todas las tablas por su nombre. Básicamente una lista de tablas por nombre ascendente.

Luego puede intentar esto para describir una tabla por campos:

\d tablename.

Espero que esto ayude.

Ty_
fuente
@wingedpanther cómo hacerlo? hay una \dopción para listar solo todas las tablas, sin índice, sin secuencia, ...?
Peter Krauss
55
¿ \dtNo hay para esto?
thoroc
11

Prueba esto:

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

este funciona!

TS
fuente
No creo que lo necesitemos table_type='BASE TABLE'. Tal vez me equivoque, ¿podría explicarlo?
abriggs
a veces es útil filtrar la base de datos conectada actual agregando: y 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.
fuente
1
pg_stat_user_tablespodría no rellenarse si track_activitiesestá deshabilitado. Usar la API "oficial" como pg_tableso information_schema.tablees una opción mucho mejor.
a_horse_with_no_name
0
SELECT table_name
FROM information_schema.tables
WHERE table_type='BASE TABLE'
AND table_schema='public';

Para MySQL necesitaría table_schema = 'dbName' y para MSSQL eliminar esa condición.

Observe que "solo se muestran esas tablas y vistas a las que el usuario actual tiene acceso". Además, si tiene acceso a muchas bases de datos y desea limitar el resultado a una determinada base de datos, puede lograrlo agregando la condición AND table_catalog = 'yourDatabase' (en PostgreSQL).

Si también desea deshacerse del encabezado que muestra los nombres de las filas y el pie de página que muestra el recuento de filas, puede iniciar psql con la opción de línea de comando -t (abreviatura de --tuples-only) o puede alternar la configuración en psql's línea de comando por \ t (abreviatura de \ pset tuples_only). Esto podría ser útil, por ejemplo, al canalizar la salida a otro comando con \ g [| comando].

Kashif
fuente