Consulta do PostgreSQL para listar todos os nomes de tabela?

184

Existe alguma consulta disponível para listar todas as tabelas no meu banco de dados do Postgres.

Eu tentei uma consulta como:

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

Mas essa consulta também retorna visualizações.

Como posso obter apenas nomes de tabelas e não visualizações?

jobi88
fonte

Respostas:

307

Que tal esta consulta (com base na descrição do manual )?

SELECT table_name
  FROM information_schema.tables
 WHERE table_schema='public'
   AND table_type='BASE TABLE';
vyegorov
fonte
4
Esta é a melhor resposta aqui.
21416 Tommy
3
O que é um tipo de tabela?
Bryan Bryce
table_type do manual: Tipo da tabela: BASE TABLE para uma tabela base persistente (o tipo de tabela normal), VIEW para uma vista, FOREIGN para uma tabela estrangeira ou LOCAL TEMPORARY para uma tabela temporária
tzachs
38

Se você deseja lista de banco de dados

SELECT datname FROM pg_database WHERE datistemplate = false;

Se você deseja uma lista de tabelas da instalação atual da página de todos os bancos de dados

SELECT table_schema,table_name FROM information_schema.tables
ORDER BY table_schema,table_name;
Harsh
fonte
Pelo menos no Postgres 9.5, isso não é verdade. Eu tenho 3 bancos de dados em um cluster, e isso está retornando apenas tabelas do banco de dados atual.
sudo
A documentação diz apenas a atual: postgresql.org/docs/9.5/static/infoschema-tables.html "table_catalog sql_identifier Nome do banco de dados que contém a tabela (sempre o banco de dados atual)"
sudo
28

Abra o terminal postgres com o banco de dados que você deseja:

psql dbname (run this line in a terminal)

em seguida, execute este comando no ambiente postgres

\d

Isso descreverá todas as tabelas por nome. Basicamente, uma lista de tabelas por nome crescente.

Então você pode tentar isso para descrever uma tabela por campos:

\d tablename.

Espero que isto ajude.

Ty_
fonte
@wingedpanther como? existe uma \dopção para listar apenas todas as tabelas, sem índice, sem seq, ...?
Peter Krauss
5
É \dtnão há para isso?
thoroc
11

Tente o seguinte:

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

esse funciona!

TS
fonte
Eu não acho que precisamos table_type='BASE TABLE'. Talvez eu esteja errado, você poderia, por favor, elaborar?
abriggs
às vezes é útil filtrar a adição de banco de dados conectada atual: e table_catalog = current_database () #
59619 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.
fonte
1
pg_stat_user_tablespode não ser preenchido se track_activitiesestiver desativado. Usar a API "oficial" como pg_tablesou information_schema.tableé uma escolha muito melhor.
A_horse_with_no_name
0
SELECT table_name
FROM information_schema.tables
WHERE table_type='BASE TABLE'
AND table_schema='public';

Para o MySQL, você precisaria de table_schema = 'dbName' e, para o MSSQL, remova essa condição.

Observe que "apenas as tabelas e visualizações são mostradas às quais o usuário atual tem acesso". Além disso, se você tiver acesso a muitos bancos de dados e quiser limitar o resultado a um determinado banco de dados, poderá conseguir isso adicionando a condição AND table_catalog = 'yourDatabase' (no PostgreSQL).

Se você também quiser se livrar do cabeçalho que mostra os nomes das linhas e do rodapé que mostra a contagem de linhas, você pode iniciar o psql com a opção de linha de comando -t (abreviação de --tuples-only) ou alternar a configuração nos psql's linha de comando por \ t (abreviação de \ pset tuples_only). Isso pode ser útil, por exemplo, ao canalizar a saída para outro comando com \ g [| comando].

Kashif
fonte