Cómo encontrar una tabla que tenga una columna específica en postgresql

92

Estoy usando PostgreSQL 9.1. Tengo el nombre de columna de una tabla. ¿Es posible encontrar la (s) tabla (s) que tiene / tienen esta columna? ¿Si es así, cómo?

Hasan Iqbal
fuente

Respuestas:

62

puede consultar los catálogos del 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

Roman Pekar
fuente
1
Tenga en cuenta que esta consulta no parece aceptar comodines '%', mientras que la consulta en la respuesta de Ravi sí.
Skippy le Grand Gourou
@SkippyleGrandGourou Acepta "me gusta 'id%'"
jutky
esto no funcionó para mí con o sin comodines, tuve que usar information.schema para buscar
Lrawls
145

Tu tambien puedes hacer

 select table_name from information_schema.columns where column_name = 'your_column_name'
Ravi Shekhar
fuente
1
curiosamente, he visto casos en los que esta consulta muestra tablas que la consulta de @ RomanPekar no muestra; Me pregunto por qué sería eso
Ken Bellows
1
@KenBellows Supongo que pg_class / pg_attirbute puede cambiar con nuevas versiones de Postgresql mientras que information_schema está definido en la especificación ANSI. Entonces, para consultas generales, diría que esta respuesta es mejor. A veces necesito tener una identificación de objeto, por ejemplo, en este caso, necesito usar tablas específicas de db-engine. Además, las vistas de information_schema son siempre un paso adicional sobre las tablas específicas del motor de base de datos y, a veces, pueden conducir a un rendimiento (ligeramente) peor
Roman Pekar
Esta fue la más precisa de las dos soluciones ofrecidas, en mi caso. La consulta pg_class omitió dos (de 150) tablas. La consulta information_schema capturó todas las tablas. Tendré que investigar para ver por qué dos mesas cayeron fuera de la unión. En cualquier caso, ¡gracias por la información!
Thomas Altfather Good
7

Usé la consulta de @Roman Pekar como base y agregué el nombre del esquema (relevante en mi 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

jutky
fuente
1

Simplemente:

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

Agrandar -B offset para obtener el nombre de la tabla, si es necesario

Dmitry
fuente
1

Compatibilidad con comodines Busque el esquema de la tabla y el nombre de la tabla que contiene la cadena que desea buscar.

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;
jjj
fuente
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;
romuloMendes
fuente
2
Por favor, editar su respuesta para incluir una explicación de su código. La pregunta tiene más de seis años y ya tiene una respuesta aceptada además de varias bien explicadas y bien votadas. Sin esa explicación en su respuesta, es posible que se elimine o se elimine. Agregar esa información adicional ayudaría a justificar la existencia continua de su respuesta aquí.
Das_Geek