Como encontrar uma tabela com uma coluna específica no postgresql


91

Estou usando o PostgreSQL 9.1. Eu tenho o nome da coluna de uma tabela. É possível encontrar a (s) tabela (s) que possui / possui esta coluna? Se sim, como?

Respostas:


61

você pode consultar catálogos do sistema :

select c.relname
from pg_class as c
    inner join pg_attribute as a on a.attrelid = c.oid
where a.attname = <column name> and c.relkind = 'r'

sql fiddle demo


1
Observe que esta consulta não parece aceitar os curingas '%', enquanto a consulta na resposta de Ravi aceita.
Skippy le Grand Gourou

@SkippyleGrandGourou Aceita "como 'id%'"
jutky,

isso não funcionou para mim com ou sem curingas, eu tive que usar information.schema para pesquisar
Lrawls

144

Você também pode fazer

 select table_name from information_schema.columns where column_name = 'your_column_name'

1
estranhamente, já vi casos em que essa consulta mostra tabelas que a consulta de @RomanPekar não mostra; Eu me pergunto por que isso seria
Ken Bellows

1
@KenBellows Eu acho que pg_class / pg_attirbute pode mudar com novas versões do Postgresql enquanto information_schema é definido na especificação ANSI. Portanto, para consultas gerais, eu diria que esta resposta é melhor. Às vezes preciso ter a id do objeto, por exemplo, neste caso preciso usar tabelas específicas do db-engine. Além disso, as visualizações information_schema são sempre uma etapa adicional sobre as tabelas específicas do mecanismo de banco de dados e às vezes podem levar a um desempenho (um pouco) pior
Roman Pekar

Esta foi a mais precisa das duas soluções oferecidas - no meu caso. A consulta pg_class perdeu duas (de 150) tabelas. A consulta information_schema capturou todas as tabelas. Terei que pesquisar para ver por que duas tabelas caíram fora da junção. Em qualquer caso, obrigado pela informação!
Thomas Altfather Good

7

Usei a consulta de @Roman Pekar como base e adicionei o nome do esquema (relevante no meu caso)

select n.nspname as schema ,c.relname
    from pg_class as c
    inner join pg_attribute as a on a.attrelid = c.oid
    inner join pg_namespace as n on c.relnamespace = n.oid
where a.attname = 'id_number' and c.relkind = 'r'

sql fiddle demo


1

Simplesmente:

$ psql mydatabase -c '\d *' | grep -B10 'mycolname'

Aumente o deslocamento -B para obter o nome da tabela, se necessário


1

Suporte a curinga Encontre o esquema e o nome da tabela que contém a string que você deseja encontrar.

select t.table_schema,
       t.table_name
from information_schema.tables t
inner join information_schema.columns c on c.table_name = t.table_name
                                and c.table_schema = t.table_schema
where c.column_name like '%STRING%'
      and t.table_schema not in ('information_schema', 'pg_catalog')
      and t.table_type = 'BASE TABLE'
order by t.table_schema;

0
select t.table_schema,
       t.table_name
from information_schema.tables t
inner join information_schema.columns c on c.table_name = t.table_name 
                                and c.table_schema = t.table_schema
where c.column_name = 'name_colum'
      and t.table_schema not in ('information_schema', 'pg_catalog')
      and t.table_type = 'BASE TABLE'
order by t.table_schema;

2
Por favor edite sua resposta para incluir uma explicação para o seu código. A pergunta tem mais de seis anos e já tem uma resposta aceita, além de várias bem votadas e bem explicadas. Sem essa explicação em sua resposta, ela será rejeitada ou removida. Adicionar essa informação extra ajudaria a justificar a continuação da existência de sua resposta aqui.
Das_Geek
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.