Como encontrar todas as tabelas no MySQL com nomes de colunas específicos?

Respostas:

1397

Para obter todas as tabelas com colunas columnAou ColumnBno banco de dados YourDatabase:

SELECT DISTINCT TABLE_NAME 
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME IN ('columnA','ColumnB')
        AND TABLE_SCHEMA='YourDatabase';
Ken
fonte
6
@Echo - você pode sempre jogar com mysqldump com --skip-extended-insert e, em seguida, grep através do arquivo ... sujo, mas estranhamente satifying :)
Ken
1
@ Eco, para versões anteriores a 5 despejar a estrutura do arquivo usando o mysqldump, veja minha resposta.
Radu Maris
8
Você também pode usar em DATABASE()vez de uma sequência para pesquisar no banco de dados selecionado no momento.
Sherlock
1
@ Ken: existe uma maneira de adicionar mais um filtro à sua consulta? De fato, selecionar as tabelas em que a colunaA tem um valor específico.
Fred FLECHE
2
@FredFLECHE Eu acho que nessa fase Gostaria apenas percorrer-los em um script e mantê-lo simples
Ken
176
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%wild%';
GSerg
fonte
13
Se houver vários bancos de dados, adicione uma linha WHERE TABLE_SCHEMA = "" também.
John Millikin
1
Obrigado John, como será a consulta se eu precisar obter os nomes das tabelas que possuem as colunas A e B da coluna?
Jobi Joy
1
@JohnMillikin: ou, inversamente, se você não conhece o banco de dados, mas apenas o nome do campo, deixe-o de fora e adicione TABLE_SCHEMA-o aos campos do conjunto de retorno para ver todos os bancos de dados + tabelas que contêm esse nome de coluna.
Abel
Isso não deveria ler: como '% wild%' ou = 'wild' em vez de como 'wild'?
Uncle Iroh
1
Eu apenas tentei isso, mas notei todos os resultados obtidos para objetos que não aparecem na consulta show tables;. Alguém pode explicar por que esse pode ser o caso?
Wdkrnls
46

Mais simplesmente feito em uma linha de SQL:

SELECT * FROM information_schema.columns WHERE column_name = 'column_name';
Xman Classical
fonte
Há alguma desvantagem de usar * aqui?
Guney Ozsan
38
SELECT DISTINCT TABLE_NAME, COLUMN_NAME  
FROM INFORMATION_SCHEMA.COLUMNS  
WHERE column_name LIKE 'employee%'  
AND TABLE_SCHEMA='YourDatabase'
baycaysoi
fonte
19

Na versão que não possui information_schema(versões mais antigas ou alguns ndb's), você pode despejar a estrutura da tabela e pesquisar a coluna manualmente.

mysqldump -h$host -u$user -p$pass --compact --no-data --all-databases > some_file.sql

Agora pesquise o nome da coluna some_file.sqlusando seu editor de texto preferido ou use alguns scripts bacanas do awk.


E um script sed simples para encontrar a coluna, substitua COLUMN_NAME pelo seu:

sed -n '/^USE/{h};/^CREATE/{H;x;s/\nCREATE.*\n/\n/;x};/COLUMN_NAME/{x;p};' <some_file.sql
USE `DATABASE_NAME`;
CREATE TABLE `TABLE_NAME` (
  `COLUMN_NAME` varchar(10) NOT NULL,

Você pode canalizar o despejo diretamente no sed, mas isso é trivial.

Radu Maris
fonte
12

Para quem procura o inverso disso, ou seja, procura por tabelas que não contêm um determinado nome de coluna, aqui está a consulta ...

SELECT DISTINCT TABLE_NAME FROM information_schema.columns WHERE 
TABLE_SCHEMA = 'your_db_name' AND TABLE_NAME NOT IN (SELECT DISTINCT 
TABLE_NAME FROM information_schema.columns WHERE column_name = 
'column_name' AND TABLE_SCHEMA = 'your_db_name');

Isso foi realmente útil quando começamos a implementar lentamente o uso da ai_colcoluna especial do InnoDB e precisávamos descobrir quais de nossas 200 tabelas ainda tinham que ser atualizadas.

oucil
fonte
8

Se você deseja " Obter apenas todas as tabelas ", use esta consulta:

SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME like '%'
and TABLE_SCHEMA = 'tresbu_lk'

Se você deseja " Obter todas as tabelas com colunas ", use esta consulta:

SELECT DISTINCT TABLE_NAME, COLUMN_NAME  
FROM INFORMATION_SCHEMA.COLUMNS  
WHERE column_name LIKE '%'  
AND TABLE_SCHEMA='tresbu_lk'
Shivendra Prakash Shukla
fonte
6

Use esta consulta de uma linha, substitua o nome_coluna_nome desejado pelo nome da coluna.

SELECT TABLE_NAME FROM information_schema.columns WHERE column_name = 'desired_column_name';
António Delgado
fonte
4
SELECT DISTINCT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME LIKE '%city_id%' AND TABLE_SCHEMA='database'
nageen nayak
fonte
2

O problema com o information_schema é que ele pode ser terrivelmente lento. É mais rápido usar os comandos SHOW.

Depois de selecionar o banco de dados, você primeiro envia a consulta SHOW TABLES. E então você MOSTRA COLUNAS para cada uma das tabelas.

No PHP, isso seria algo como

    $ res = mysqli_query ("MOSTRAR TABELAS");
    while ($ row = mysqli_fetch_array ($ res))
    {$ rs2 = mysqli_query ("SHOW COLUMNS FROM". $ row [0]);
        while ($ rw2 = mysqli_fetch_array ($ rs2))
        {if ($ rw2 [0] == $ target)
               ....
        }
    }

user2587656
fonte
0
select distinct table_name 
from information_schema.columns 
where column_name in ('ColumnA') 
and table_schema='YourDatabase';
and table_name in 
(
 select distinct table_name 
 from information_schema.columns 
 where column_name in ('ColumnB')
 and table_schema='YourDatabase';
);

Que ^^ obterá as tabelas com ColumnA AND ColumnB em vez de ColumnA OR ColumnB como a resposta aceita

love2code
fonte