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

StackOverflow https://stackoverflow.com/questions/193780

  •  10-07-2019
  •  | 
  •  

Pregunta

Tengo 2-3 nombres de columna diferentes que quiero buscar en toda la base de datos y enumerar todas las tablas que tienen esas columnas. ¿Alguna secuencia de comandos fácil?

¿Fue útil?

Solución

Para obtener todas las tablas con columnas columnA o ColumnB en la base de datos YourDatabase :

SELECT DISTINCT TABLE_NAME 
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME IN ('columnA','ColumnB')
        AND TABLE_SCHEMA='YourDatabase';

Otros consejos

SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%wild%';

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

SELECT * FROM information_schema.columns WHERE column_name = 'column_name';
SELECT DISTINCT TABLE_NAME, COLUMN_NAME  
FROM INFORMATION_SCHEMA.COLUMNS  
WHERE column_name LIKE 'employee%'  
AND TABLE_SCHEMA='YourDatabase'

En la versión que no tiene information_schema (versiones anteriores o algunas ndb's) 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 en some_file.sql usando su editor de texto preferido, o use algunos scripts ingeniosos awk.


Y un script sed simple 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.

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 columna especial ai_col de InnoDB y necesitábamos descubrir cuáles de nuestras 200 tablas aún no se habían actualizado.

Si desea " Para obtener todas las tablas solamente " ;, entonces use 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 " ;, luego use esta consulta:

SELECT DISTINCT TABLE_NAME, COLUMN_NAME  
FROM INFORMATION_SCHEMA.COLUMNS  
WHERE column_name LIKE '%'  
AND TABLE_SCHEMA='tresbu_lk'

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

SELECT TABLE_NAME FROM information_schema.columns WHERE column_name = 'desired_column_name';
SELECT DISTINCT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME LIKE '%city_id%' AND TABLE_SCHEMA='database'

El problema con el esquema de información 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, MOSTRAR COLUMNAS para cada una de las tablas.

En PHP se vería algo así como

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top