Comment trouver toutes les tables dans MySQL avec des noms de colonnes spécifiques?

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

  •  10-07-2019
  •  | 
  •  

Question

Je souhaite rechercher dans la base de données entière deux ou trois noms de colonne différents et répertorier toutes les tables contenant ces colonnes. Un script facile?

Était-ce utile?

La solution

Pour obtenir toutes les tables avec les colonnes columnA ou Column dans la base de données Votre base de données :

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

Autres conseils

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

Plus simplement en une ligne de code 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'

Dans les versions ne disposant pas de schémas_informations (versions antérieures, ou ndb), vous pouvez vider la structure du tableau et rechercher la colonne manuellement.

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

Recherchez maintenant le nom de la colonne dans some_file.sql en utilisant votre éditeur de texte préféré, ou utilisez des scripts astucieux awk.

Et un simple script sed pour trouver la colonne, remplacez simplement COLUMN_NAME par le votre:

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,

Vous pouvez diriger le dump directement dans sed, mais c'est trivial.

Pour ceux qui recherchent l'inverse, c'est-à-dire des tables qui ne contiennent pas un certain nom de colonne, voici la requête ...

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

Cela s’est avéré très utile lorsque nous avons commencé à utiliser progressivement la colonne spéciale ai_col d’InnoDB et que nous devions déterminer laquelle de nos 200 tables n’avait pas encore été mise à niveau.

Si vous souhaitez " uniquement obtenir les tables ", utilisez la requête suivante:

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

Si vous souhaitez " obtenir toutes les tables avec des colonnes ", utilisez cette requête:

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

Utilisez cette requête sur une ligne, remplacez le nom de colonne souhaité par votre nom de colonne.

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'

Le problème avec information_schema est qu’elle peut être terriblement lente. Il est plus rapide d’utiliser les commandes SHOW.

Après avoir sélectionné la base de données, vous envoyez d'abord la requête SHOW TABLES. Et ensuite, vous affichez les colonnes pour chacune des tables.

En PHP, cela ressemblerait à quelque chose comme

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top