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?
Pour obtenir toutes les tables avec les colonnes columnA
ou ColumnB
dans la base de données YourDatabase
:
SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME IN ('columnA','ColumnB')
AND TABLE_SCHEMA='YourDatabase';
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%wild%';
Plus simplement dans une ligne 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'
Dans les versions qui n'ont pas information_schema
(versions antérieures ou certaines 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
Maintenant, recherchez 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 vidage 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
de InnoDB et que nous devions déterminer laquelle de nos 200 tables n'avait pas encore été mise à jour.
Si vous voulez "Pour obtenir toutes les tables uniquement", utilisez 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 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 désiré 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 que cela 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 ensuite, vous affichez les colonnes pour chacune des tables.
Dans PHP, cela ressemblerait à quelque chose comme
$ res = mysqli_query ("SHOW TABLES"); tant que ($ row = mysqli_fetch_array ($ res)) {$ rs2 = mysqli_query ("SHOW COLUMNS FROM ". $ Row [0]); While ($ rw2 = mysqli_fetch_array ($ rs2)) {If ($ rw2 [0] == $ target) .... } }