Comment trouver toutes les tables dans MySQL avec des noms de colonnes spécifiques?
-
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?
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) .... } }