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

Réponses:

1397

Pour obtenir toutes les tables avec des colonnes columnAou ColumnBdans la base de données YourDatabase:

SELECT DISTINCT TABLE_NAME 
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME IN ('columnA','ColumnB')
        AND TABLE_SCHEMA='YourDatabase';
Ken
la source
6
@Echo - vous pouvez toujours jouer avec mysqldump avec --skip-extended-insert et ensuite parcourir le fichier ... sale mais étrangement satisfaisant :)
Ken
1
@Echo, pour les versions antérieures à 5 vider la structure dans un fichier en utilisant mysqldump, voir ma réponse.
Radu Maris
8
Vous pouvez également utiliser DATABASE()au lieu d'une chaîne pour rechercher dans la base de données actuellement sélectionnée.
Sherlock
1
@Ken: existe-t-il un moyen d'ajouter un filtre supplémentaire à votre requête? En effet, sélectionner les tables où de columnA a une valeur spécifique.
Fred FLECHE
2
@FredFLECHE Je pense qu'à ce stade, je les parcourrais simplement dans un script et je resterais simple
Ken
176
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%wild%';
GSerg
la source
13
S'il existe plusieurs bases de données, ajoutez également une ligne WHERE TABLE_SCHEMA = "".
John Millikin
1
Merci John, comment sera la requête si j'ai besoin d'obtenir des noms de table contenant des colonnes A et ColonneB?
Jobi Joy
1
@JohnMillikin: ou inversement, si vous ne connaissez pas la base de données mais seulement le nom du champ, laissez-le et ajoutez TABLE_SCHEMAaux champs de l'ensemble de retour pour voir toutes les bases de données + tables qui contiennent ce nom de colonne.
Abel
Cela ne devrait-il pas se lire non plus: comme '% wild%' ou = 'wild' au lieu de comme 'wild'?
Oncle Iroh
1
Je viens d'essayer cela, mais j'ai remarqué tous les résultats que j'ai obtenus pour les objets qui n'apparaissent pas avec la requête show tables;. Quelqu'un peut-il expliquer pourquoi cela pourrait être le cas?
wdkrnls
46

Plus simplement fait dans une seule ligne de SQL:

SELECT * FROM information_schema.columns WHERE column_name = 'column_name';
Xman Classique
la source
Y a-t-il des inconvénients à utiliser * ici?
Guney Ozsan
38
SELECT DISTINCT TABLE_NAME, COLUMN_NAME  
FROM INFORMATION_SCHEMA.COLUMNS  
WHERE column_name LIKE 'employee%'  
AND TABLE_SCHEMA='YourDatabase'
baycaysoi
la source
19

Dans les versions qui n'en ont pas information_schema(anciennes versions ou certaines ndb), vous pouvez vider la structure de la table 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 en some_file.sqlutilisant votre éditeur de texte préféré, ou utilisez des scripts awk astucieux.


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

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 vidage directement dans sed mais c'est trivial.

Radu Maris
la source
12

Pour ceux qui recherchent l'inverse de cela, c'est-à-dire qui recherchent 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 ai_colavéré très pratique lorsque nous avons commencé à implémenter lentement l'utilisation de la colonne spéciale d'InnoDB et que nous devions déterminer laquelle de nos 200 tables n'avait pas encore été mise à niveau.

oucil
la source
8

Si vous voulez " Pour obtenir toutes les tables uniquement ", utilisez alors cette requête:

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

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

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

Utilisez cette requête d'une ligne, remplacez le nom_colonne_désiré par votre nom de colonne.

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

Le problème avec information_schema est qu'il peut être terriblement lent. 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 puis vous affichez les colonnes pour chacune des tables.

En PHP, cela ressemblerait à quelque chose comme

    $ res = mysqli_query ("AFFICHER LES 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)
               ....
        }
    }

user2587656
la source
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 ^^ obtiendra les tables avec ColonneA ET ColonneB au lieu de ColonneA OU ColonneB comme la réponse acceptée

love2code
la source