Come trovare una tabella con una colonna specifica in postgresql


92

Sto usando PostgreSQL 9.1. Ho il nome della colonna di una tabella. È possibile trovare le tabelle che hanno / hanno questa colonna? Se é cosi, come?

Risposte:


62

puoi interrogare i cataloghi di 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
Nota che questa query non sembra accettare i caratteri jolly '%', mentre la query nella risposta di Ravi sì.
Skippy le Grand Gourou

@SkippyleGrandGourou Accetta "come 'id%'"
jutky

questo non ha funzionato per me con o senza caratteri jolly, ho dovuto usare information.schema per cercare
Lrawls

144

Puoi anche farlo

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

1
stranamente, ho visto casi in cui questa query mostra tabelle che la query di @ RomanPekar non mostra; Mi chiedo perché sarebbe
Ken Bellows

1
@KenBellows Immagino che pg_class / pg_attirbute possa cambiare con le nuove versioni di Postgresql mentre information_schema è definito nella specifica ANSI. Quindi per domande generali direi che questa risposta è migliore. A volte ho bisogno di avere un ID oggetto, ad esempio, in questo caso devo usare tabelle specifiche del db-engine. Inoltre, le visualizzazioni information_schema sono sempre un passaggio aggiuntivo rispetto alle tabelle specifiche del motore db e talvolta possono portare a prestazioni (leggermente) peggiori
Roman Pekar

Questa era la più accurata delle due soluzioni offerte, nel mio caso. La query pg_class ha mancato due (di 150) tabelle. La query information_schema ha acquisito tutte le tabelle. Dovrò scavare un po 'per vedere perché due tavoli sono fuori dal join. In ogni caso grazie per le info!
Thomas Altfather Good

7

Ho usato la query di @Roman Pekar come base e ho aggiunto il nome dello schema (rilevante nel mio 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

Semplicemente:

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

Ingrandire l'offset -B per ottenere il nome della tabella, se necessario


1

Supporto caratteri jolly Trova lo schema della tabella e il nome della tabella che contiene la stringa che desideri trovare.

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
Si prega di modificare la risposta per includere una spiegazione per il codice. La domanda ha più di sei anni e ha già una risposta accettata oltre a molte ben votate e ben spiegate. Senza una tale spiegazione sulla tua risposta, sarà sottovalutata o rimossa. L'aggiunta di queste informazioni extra aiuterebbe a giustificare l'esistenza della tua risposta qui.
Das_Geek
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.