¿Cómo encontrar todas las tablas en MySQL con nombres de columna específicos en ellas?

Respuestas:

1397

Para obtener todas las tablas con columnas columnAo ColumnBen la base de datos YourDatabase:

SELECT DISTINCT TABLE_NAME 
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME IN ('columnA','ColumnB')
        AND TABLE_SCHEMA='YourDatabase';
Conocer
fuente
66
@Echo: siempre puedes jugar con mysqldump con --skip-extended-insert y luego hojear el archivo ... sucio pero extrañamente saciante :)
Ken
1
@ Eco, para versiones anteriores a 5 volcar la estructura al archivo usando mysqldump, vea mi respuesta.
Radu Maris
8
También puede usar en DATABASE()lugar de una cadena para buscar en la base de datos seleccionada actualmente.
Sherlock
1
@ Ken: ¿hay alguna manera de agregar un filtro más a su consulta? De hecho, seleccionando las tablas donde de columnA tiene un valor específico.
Fred FLECHE
2
@FredFLECHE Creo que en ese momento simplemente los recorrería en un guión y lo mantendría simple
Ken
176
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%wild%';
GSerg
fuente
13
Si hay varias bases de datos, agregue una línea WHERE TABLE_SCHEMA = "" también.
John Millikin
1
Gracias John, ¿cómo será la consulta si necesito obtener nombres de tablas que tengan presente la columna A y la columna B?
Jobi Joy
1
@JohnMillikin: o por el contrario, si no conoce la base de datos, sino solo el nombre del campo, no la agregue y agregue TABLE_SCHEMAa los campos del conjunto de retorno para ver todas las bases de datos + tablas que contienen ese nombre de columna.
Abel
¿No debería leer eso: como '% wild%' o = 'wild' en lugar de como 'wild'?
Tío Iroh
1
Acabo de intentar esto pero noté todos los resultados que obtuve para los objetos que no aparecen con la consulta show tables;. ¿Alguien puede explicar por qué este podría ser el caso?
wdkrnls
46

Más simplemente hecho en una línea de SQL:

SELECT * FROM information_schema.columns WHERE column_name = 'column_name';
Xman Classical
fuente
¿Hay alguna desventaja de usar * aquí?
Guney Ozsan
38
SELECT DISTINCT TABLE_NAME, COLUMN_NAME  
FROM INFORMATION_SCHEMA.COLUMNS  
WHERE column_name LIKE 'employee%'  
AND TABLE_SCHEMA='YourDatabase'
baycaysoi
fuente
19

En la versión que no tiene information_schema(versiones anteriores o algunas ndb) puede volcar la estructura de la tabla y buscar la columna manualmente.

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

Ahora busque el nombre de la columna some_file.sqlusando su editor de texto preferido, o use algunos scripts ingeniosos awk.


Y un simple script sed para encontrar la columna, simplemente reemplace COLUMN_NAME con el suyo:

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,

Puede canalizar el vertedero directamente en sed, pero eso es trivial.

Radu Maris
fuente
12

Para aquellos que buscan el inverso de esto, es decir, que buscan tablas que no contienen un nombre de columna determinado, aquí está la 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');

Esto fue muy útil cuando comenzamos a implementar lentamente el uso de la ai_colcolumna especial de InnoDB y necesitábamos descubrir cuáles de nuestras 200 tablas aún no se habían actualizado.

oucil
fuente
8

Si desea " Para obtener todas las tablas solamente ", utilice esta consulta:

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

Si desea " Para obtener todas las tablas con columnas ", utilice esta consulta:

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

Use esta consulta de una línea, reemplace el nombre_columna_de_de_de_superior por el nombre de su columna.

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

El problema con information_schema es que puede ser terriblemente lento. Es más rápido usar los comandos SHOW.

Después de seleccionar la base de datos, primero envía la consulta MOSTRAR TABLAS. Y luego haces SHOW COLUMNS para cada una de las tablas.

En PHP eso se vería algo así

    $ res = mysqli_query ("MOSTRAR TABLAS");
    while ($ row = mysqli_fetch_array ($ res))
    {$ rs2 = mysqli_query ("MOSTRAR COLUMNAS DE". $ row [0]);
        while ($ rw2 = mysqli_fetch_array ($ rs2))
        {if ($ rw2 [0] == $ target)
               ....
        }
    }

usuario2587656
fuente
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';
);

Eso ^^ obtendrá las tablas con Columna A Y Columna B en lugar de Columna A O Columna B como la respuesta aceptada

love2code
fuente