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';

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%';

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';

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'

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.


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.


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'

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';

4
SELECT DISTINCT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME LIKE '%city_id%' AND TABLE_SCHEMA='database'

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)
               ....
        }
    }


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

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.